<?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="/tag/プログラミング/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>Node.jsでSlack Command Botをつくってみよう</title>
		<link>/girlie_mac/22535/</link>
		<pubDate>Fri, 03 Mar 2017 00:00:22 +0000</pubDate>
		<dc:creator><![CDATA[Tomomi Imura]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[ECMAScript]]></category>
		<category><![CDATA[ES6]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Node.js]]></category>
		<category><![CDATA[Slack]]></category>
		<category><![CDATA[UX]]></category>
		<category><![CDATA[bot]]></category>
		<category><![CDATA[海外]]></category>

		<guid isPermaLink="false">/?p=22535</guid>
		<description><![CDATA[こんにちは。ごぶさたしています。以前の執筆から１年ちょっとになるのですが、その当時はInternet of Things(IoT)について書いたのですが、最近では市場がある程度まで到達したからでしょうか、それとも脆弱性の...]]></description>
				<content:encoded><![CDATA[<p>こんにちは。ごぶさたしています。以前の執筆から１年ちょっとになるのですが、その当時はInternet of Things(IoT)について書いたのですが、最近では市場がある程度まで到達したからでしょうか、それとも脆弱性の問題を問われることが多くなったせいでしょうか、話題は少し落ち着いてきたかに思われます。さて今ホットな話題は何でしょうか、ということで今回はChat Botsについて書いてみようと思います。</p>

<h3>E-Commerceから Conversational Commerceへ</h3>

<p>ここ最近話題になることが多いAIやBotsですが、私の周りではConversational interface、Conversational UXなどという言葉が去年からたびたび使われるようになっているようです。</p>

<p>これはAmazon Alexaなどのデバイスや、Facebook Messengerなどチャットアプリケーションなどの対話型テクノロジーをいかに活用しその使い勝手をよくするか、ということなのですが、必ずしもアプリケーションのUIデザインそのものを述べているわけではなく、既存のサービスを延長することを指していることも多いでしょう。例えば、今まではモバイル上のアプリケーションのみで車を呼べていたUberが、<a href="https://newsroom.uber.com/messengerlaunch/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Facebook Messenger のチャットからも車をを呼べるような機能</a>を加えたり、Slack上でTaco Bellからタコスをオーダーできる<a href="https://www.tacobell.com/feed/tacobot" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">TacoBot</a>、というのもが挙げられます。</p>

<h3>Slack Botを書いてみよう</h3>

<p>さて、というわけで何かBotを書いてみたいと思いませんか？ここはNode.jsでSlack botを作成する方法を紹介したいと思います。</p>

<p>このチュートリアルでは、ディベロッパー向けのHTTPステータスコードのルックアップができるスラッシュ・コマンドを作ってみます。ここでは私が５年ほど前に何気なく作って、Mashableなどで紹介され思わぬ反響を得てしまった<a href="http://http.cat/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HTTP Status Cats</a>を使ってみます。具体的には、Slack上でユーザが、<code>/httpstatus [code]</code> （例えば <code>/httpstatus 404</code>）と入力すると、そのステータスコードの意味と猫が一緒に表示される、という簡単なbotです。</p>

<p>まず試してみたい方は、<a href="http://www.girliemac.com/slack-httpstatuscats/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HTTP Status Cats command for Slack</a>を自分がアドミン権限のあるのチャットチームにインストールしてみてください。</p>

<p><img src="/wp-content/uploads/2017/02/slack-httpstatuscats.gif" alt="slack-httpstatuscats gif animation" width="640" height="437" class="aligncenter size-full wp-image-22558" /></p>

<p>さて、このチュートリアルは２つのパートに分けられます。</p>

<ol>
<li>スラッシュ・コマンドを書いて、自分のSlackチームにインストールする
<li>OAuthを使ってボットを<a href="https://slack.com/apps" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Slack&#8217;s App Directory</a>などで誰もがインストールできるようにする</ol>

<p></ol></p>

<p>とりあえず動くbotを書いてみたい、と思う方は１だけ試してみてで十分ですが、botをみんなにシェアしたい方は２も読んでみてください。</p>

<p><a href="https://github.com/girliemac/slack-httpstatuscats" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ソースコード</a>と実際のボットのインストールボタンは両方GitHubにあります。では始めましょう！</p>

<h2>1 プライベートなスラッシュコマンドボットの作成</h2>

<p>ここで作るのは、Slackの公式な用語でいうところの<a href="https://api.slack.com/custom-integrations" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Custom Integrations</a>というもので、自分のチャットグループ専用のプライベートなbot、もしくはいわゆるAppとして発表する前にドライ・ランを行うことを指します。アカウントを持っていない方はまずサインアップしてから始めましょう。</p>

<h3>1.1 スラッシュコマンドの設定</h3>

<p>ログインして、<a href="https://my.slack.com/services/new/slash-commands" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">my.slack.com/services/new/slash-commands</a>でコマンドを選びます。ここでは<code>/httpstatus</code>と入力し<strong>Add Slash Command Integration</strong>ボタンをクリックして次のステップへ進みます。</p>

<p>Tokenなどの欄がありますが現時点では、(1) Command、 (2) URL、 (3) Method、の３つが必要になります。</p>

<p><img src="/wp-content/uploads/2017/02/slack-config-custom-integration.png" alt="slack-config-custom-integration" width="431" height="640" class="aligncenter size-full wp-image-22561" srcset="/wp-content/uploads/2017/02/slack-config-custom-integration.png 431w, /wp-content/uploads/2017/02/slack-config-custom-integration-202x300.png 202w, /wp-content/uploads/2017/02/slack-config-custom-integration-139x207.png 139w" sizes="(max-width: 431px) 100vw, 431px" /></p>

<p>(1)には、<code>/httpstatus</code>、(3)には、<code>POST</code>、そして(2)のURLは次のように設定してください。</p>

<p>開発中に使用するURLを取得するには<a href="https://ngrok.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ngrok</a>を使ってみましょう。いろいろなツールがあるのですが、これは自分のローカルホストをパブリックURLとしてトンネルできるというとても便利なツールなので私のイチオシです。開発途中にデプロイすることなく、Webhookが手軽に使えます。自分のローカルホスト、たとえば  <code>http://localhost:3000/</code> をつかったままOAuthのテストもできるのです。（注：よく聞かれるのですが、ngrokはあくまでも開発ツールですのでプロダクションには適していません。デプロイメントに関しては最後の章を読んでください）</p>

<p><a href="https://ngrok.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">https://ngrok.com/</a>から自分のマシンにngrokをインストールしたら、ターミナルで自分の使いたいポート番号（このチュートリアルでは 3000）を設定します。</p>

<p></p><pre class="crayon-plain-tag">$ ngrok http 3000</pre><p></p>

<p>すると下のスクリーンショットのように、Forwardingアドレスが取得できるので、そのURL（例えば<a href="https://71f03962.ngrok.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">https://71f03962.ngrok.io/</a>)をSlackセッティングの、上のスクリーンショットで示された(2)の欄で使います。</p>

<p><img src="/wp-content/uploads/2017/02/ngrok.png" alt="ngrok" width="640" height="349" class="aligncenter size-full wp-image-22538" srcset="/wp-content/uploads/2017/02/ngrok.png 640w, /wp-content/uploads/2017/02/ngrok-300x164.png 300w, /wp-content/uploads/2017/02/ngrok-207x113.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>すべての設定が終えたらSaveボタンを押します。&#8221;Your settings have been saved!&#8221;のメッセージが画面上部に現れるのを確認してください。</p>

<h3>1.2 Node.js を使ってレスポンスを書く</h3>

<p>基本的にbotは、ユーザがSlackインターフェイス上でコマンドを実行した際HTTP POST（または設定次第では GET)によって指定先のURLにメッセージが届け、プログラムでその応答をユーザに返す、という作業になります。</p>

<p>たとえばそのユーザが<code>/httpstatus 302</code>というコマンドを送信した場合、指定URLに送られるデータは次のようになります。</p>

<p></p><pre class="crayon-plain-tag">command=/httpstatus
text=302
response_url=https://hooks.slack.com/commands/1234/5678
…</pre><p></p>

<p>Botは、これに対する応答をユーザに返します。この場合はユーザが尋ねているステータス302の定義と<a href="https://http.cat/302" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">この猫</a>を返しましょう。</p>

<p>ではそのコードを書いてみましょう。</p>

<p>まず、<strong>Express.js</strong>と<strong>body-parser</strong>をインストールします。</p>

<p></p><pre class="crayon-plain-tag">$ npm install express body-parser --save</pre><p></p>

<p><strong>index.js</strong>で、<code>express</code>のインスタンスを作り、先ほどngrokで設定したポート番号、3000でサーバを始動します。</p>

<p></p><pre class="crayon-plain-tag">'use strict';
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

const server = app.listen(3000, () =&gt; { 
console.log('Express server listening on port %d in %s mode', server.address().port, app.settings.env);});</pre><p></p>

<p>次はHTTP POSTルートメソッドで、コマンドを扱います。</p>

<p></p><pre class="crayon-plain-tag">app.post('/', (req, res) =&gt; {
 let text = req.body.text;
 // ここでbotを書きます
});</pre><p></p>

<p>ここで<code>text</code>の値を取得します。HTTP Status botの場合、<code>/httpstatus</code> コマンドの値、例えば&#8221;404&#8243;が <code>text</code>の値になります。同時に、ユーザが数字以外を入力した際にエラーメッセージを送るなどのエラーチェックもしておきましょう。</p>

<p></p><pre class="crayon-plain-tag">if(! /^\d+$/.test(q.text)) { // not a digit
 res.send('Error: enter a valid status code, such as 200');   
 return;
}</pre><p></p>

<p>このエラーは、ユーザだけにプライベートに送信されるメッセージでチャットそのものには表示されません。</p>

<p>エラーがない場合は、コマンドに対する応答をJSONとしてレスポンスします。</p>

<p></p><pre class="crayon-plain-tag">let data = {
 response_type: 'in_channel', 
 text: '302: Found',
 attachments:[{
   image_url: 'https://http.cat/302.jpg'
 }]
};
res.json(data);</pre><p></p>

<p><code>response_type</code>を<code>in_channel</code>とすることで応答はチャットメンバー全員に見えるように送信されます。デフォルトはその逆の<code>ephemeral</code>で、コマンドを送ったユーザのみに表示されます。</p>

<p>このコマンドと応答は次のようになります。</p>

<p><img src="/wp-content/uploads/2017/02/slack-command.png" alt="slack-command" width="640" height="491" class="aligncenter size-full wp-image-22540" srcset="/wp-content/uploads/2017/02/slack-command.png 640w, /wp-content/uploads/2017/02/slack-command-300x230.png 300w, /wp-content/uploads/2017/02/slack-command-207x159.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>このサンプルコードでは、応答をわかりやすくハードコードで示してありますが、実際はストリングなどは別のファイルに定義しています。下のスクリーンショットのように存在しないHTTPステータスに対してのエラーメッセージも定義しましょう。実際のコードは<a href="https://github.com/girliemac/slack-httpstatuscats" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ソースコード</a>を参照してください。</p>

<p><img src="/wp-content/uploads/2017/02/slack-command-private.png" alt="slack-command-private" width="640" height="60" class="aligncenter size-full wp-image-22539" srcset="/wp-content/uploads/2017/02/slack-command-private.png 640w, /wp-content/uploads/2017/02/slack-command-private-300x28.png 300w, /wp-content/uploads/2017/02/slack-command-private-207x19.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>ディスプレイはボーダー色などのカスタマイズが可能です。詳しくはSlackドキュメンテーションの<a href="https://api.slack.com/docs/message-formatting" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Basic message formatting</a>を参照してください。</p>

<p>次のステップでは、このボットを自分のチャットグループ以外に配布するために必要な認証とコードのデプロイについてです。</p>

<h2>2. Slack Botのディストリビューション</h2>

<p>この「Custom Integration」をインストール可能な「App」にするには、コードのデプロイをして他のチャットにもインストールできるようにせねばならないのですが、そのためにはあといつくかのステップが必要になります。</p>

<h3>2.1 Appセットアップ</h3>

<p>まず、自分のAppを申請し、クライアントIDやシークレットなどのクレデンシャルを取得します。<a href="https://api.slack.com/apps" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">https://api.slack.com/apps</a>で<strong>Create an App</strong>ボタンをクリックしてください。</p>

<p><img src="/wp-content/uploads/2017/02/slack-create-app.png" alt="slack-create-app" width="614" height="640" class="aligncenter size-full wp-image-22542" srcset="/wp-content/uploads/2017/02/slack-create-app.png 614w, /wp-content/uploads/2017/02/slack-create-app-288x300.png 288w, /wp-content/uploads/2017/02/slack-create-app-199x207.png 199w" sizes="(max-width: 614px) 100vw, 614px" /></p>

<p>このフォームにはいくつもの欄があり少しわかりづらいのですが、スラッシュコマンドのbotには次の3つが最低必要になります。</p>

<ul>
<li><strong>Basic Information</strong> (at <a href="https://api.slack.com/apps/YOUR_APP_ID/general%29" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">https://api.slack.com/apps/YOUR_APP_ID/general)</a></li>
<li><strong>OAuth &amp; Permissions</strong> (at …/YOUR_APP_ID/oauth)</li>
<li><strong>Slash Commands</strong> (at …/YOUR_APP_ID/slash-commands)</li>
</ul>

<h3>2.1.1 API Keyを.envファイルに保管</h3>

<p>ここで取得した<code>Client ID</code>、<code>Client secret</code>、<code>Verification token</code>は <strong>.env</strong> ファイルに別に保管してbotのメインのコードから切り離すことを推奨します。gitを使う場合は、このファイルを <strong>.gitignore</strong> ファイルに付け加えるのを忘れずに。</p>

<p></p><pre class="crayon-plain-tag">SLACK_CLIENT_ID=12345XXXXX.09876XXXXX 
SLACK_CLIENT_SECRET=535d2f9....
SLACK_VERIFICATION_TOKEN=42P829U...</pre><p></p>

<h3>2.1.2 Foremanを使う</h3>

<p>他にも手段はありますが、<a href="https://heroku.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Heroku</a>にデプロイするために私は<a href="http://strongloop.github.io/node-foreman/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Node Foreman</a>を使っています。Foremanを使うには、npmを使ってglobalフラッグでインストールしてください。</p>

<p></p><pre class="crayon-plain-tag">$ npm install -g foreman</pre><p></p>

<p>アプリケーションの Root に <code>.procfile</code> を作成し、この一行を加えます。</p>

<p></p><pre class="crayon-plain-tag">web: node index.js</pre><p></p>

<p>index.jsを実行するには <code>node index.js</code>の代わりに次のコマンドを使います。</p>

<p></p><pre class="crayon-plain-tag">$ nf start</pre><p></p>

<h2>2.2 ユーザの認証</h2>

<p>Slackは認証には<a href="https://oauth.net/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">OAuth</a>を使っています。実際には自分でOAuthを実装しなくても、<a href="https://api.slack.com/docs/slack-button" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Slack ボタン</a>を使えば簡単に認証できるようになっています。</p>

<p>公式のドキュメンテーションのダイアグラムに手を加えて、流れをわかりやすくするためにGIFアニメーションにしてみました。</p>

<p><img src="/wp-content/uploads/2017/02/slack-oauth-1.gif" alt="slack-oauth gif animation" width="640" height="387" class="aligncenter size-full wp-image-22559" /></p>

<p>ここでの実際のフローは次のようになります。</p>

<ol>
<li>ウェブページを作成し、認証ボタンを置く。ユーザがボタンをクリックするとパラメータがSlackに送信される(ユーザは認証ページにリダイレクトされる)。
<li>Node appには、SlackからGETで10分だけ有効な仮のコードが送られる。
<li>アクセストークンを得るために <a href="https://api.slack.com/methods/oauth.access" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">oauth.access</a> API使い認証コードをPOSTする。Node app側から`200 OK`を受け取り次第、このプロセスが完了。
<li>オプションとして、このトークンを使ってSlackの他のAPIにもアクセス。例えば、認証後、ユーザをhttps://team-name.slack.comにリダイレクトするなど。/
</ol>

<h3>2.2.1 Slack ボタンの設定</h3>

<p>Slackボタンを使うには、まずウェブページを作成してください。私の場合はこのNode Appとは切り離した別のHTMLページを作成し、<a href="http://www.girliemac.com/slack-httpstatuscats/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">GitHub Pages</a>にホストしました。</p>

<p>次にボタンを設定しましょう。 <a href="https://api.slack.com/docs/slack-button" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">https://api.slack.com/docs/slack-button</a> に行き、<strong>Add the Slack button</strong> までスクロールして下さい。</p>

<p><img src="/wp-content/uploads/2017/02/slack-generate-button.png" alt="slack-generate-button" width="640" height="268" class="aligncenter size-full wp-image-22543" srcset="/wp-content/uploads/2017/02/slack-generate-button.png 640w, /wp-content/uploads/2017/02/slack-generate-button-300x126.png 300w, /wp-content/uploads/2017/02/slack-generate-button-207x87.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>このボタン作成ツールの<strong>Commends</strong>のチェックボックスをチェックします。</p>

<p>上で示したフローの４を実行したい場合は、このGETパラメータを下のように変更します。</p>

<p></p><pre class="crayon-plain-tag">&lt;a href="https://slack.com/oauth/authorize?scope=commands+team%3Aread&amp;client_id=your_client_id"&gt;</pre><p></p>

<p>ここで<code>scope</code>に着目してみてください。<code>commands</code>の他に<code>team:read</code>(コロンは<strong>%3A</strong>とエスケープ)が必要になります。詳しくは<a href="https://api.slack.com/docs/oauth-scopes" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">OAuth scopes on the Slack API docs</a>で。</p>

<p><img src="/wp-content/uploads/2017/02/slack-button.png" alt="slack-button" width="139" height="40" class="aligncenter size-full wp-image-22548" /></p>

<h3>2.2.2 トークンの発行</h3>

<p>さて、Nodeコードに戻りましょう。仮のコード(<code>req.query.code</code>)をGETで取得するためにまたExpress.jsを使います。</p>

<p>何でもよいのですがここでは<code>/slack</code> routeを使いましょう。この場合ngrokのURL は <code>http://71f03962.ngrok.io/slack</code> のようになります。Slack App設定ページ（https://api.slack.com/apps/YOUR_APP_ID/oauth）の、<strong>OAuth &amp; Permissions</strong> セクションにある、<em>Redirect URL</em>の欄にはこのURLを設定してください。</p>

<p>仮の<code>code</code>を取得されたら、それを自分のAPIクレデンシャルとともにPOSTで送って、トークンと交換します。POSTするためにここではNode.jsのHTTPリクエストクライアントである、<code>Request</code>を使いましょう。</p>

<p></p><pre class="crayon-plain-tag">$ npm install request --save</pre><p></p>

<p>仮の<code>code</code>を取得し、それを<code>token</code>と交換するコードが下になります。</p>

<p></p><pre class="crayon-plain-tag">const request = require('request');

app.get('/slack', function(req, res){
 let data = {form: {
   client_id: process.env.SLACK_CLIENT_ID,
   client_secret: process.env.SLACK_CLIENT_SECRET,
   code: req.query.code
 }};

 request.post('https://slack.com/api/oauth.access', data, function (error, response, body) {
   if (!error &amp;&amp; response.statusCode == 200) {
     // おしまい！
     // ここからはオプションでチーム情報を取得
     let token = JSON.parse(body).access_token; // Auth token
   } ...</pre><p></p>

<h3>2.2.3 オプショナル： ユーザをチームURLにダイレクトする</h3>

<p>認証が済んだらそこで終えてもよいのですが、この画面でユーザを置き去りにするのはあまりよいUXとはいえないので、チームページにリダイレクトしてみましょう。</p>

<p>リダイレクトURLのサブドメインとなるチーム名は<a href="https://api.slack.com/methods/team.info" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">team.info</a>APIで取得できます。</p>

<p>このAPIを使うにはトークンが必要なので前述のコードでの、トークンにアクセスする箇所に下のコードを追加します。</p>

<p></p><pre class="crayon-plain-tag">...
request.post('https://slack.com/api/team.info', {form: {token: token}}, function (error, response, body) {
 if (!error &amp;&amp; response.statusCode == 200) {
   let team = JSON.parse(body).team.domain;
   res.redirect('http://' +team+ '.slack.com');
 }
});</pre><p></p>

<p>これで API からチーム名(<code>team.domain</code>)が返されました。最終的にこれを使ってチームURLにリダイレクトしてできあがり！</p>

<p>このチュートリアルでは簡素化したコードを使いましたが、<a href="https://github.com/girliemac/slack-httpstatuscats" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">全ソースコードはGitHubで</a>見てみてください。</p>

<h2>2.3 サーバにデプロイする</h2>

<p>最後にデプロイしておしまいです。APIクレデンシャルの<strong>env vars</strong>設定を忘れないように！私はHerokuを使っているのですが、Herokuの場合、<code>heroku config</code>コマンドを使います。例えば、<code>heroku config:set API_KEY=123456</code>というふうに設定してください。</p>

<p>Slackの設定で画面で指定したngrok URLを、デプロイ先のURLに変更するのもお忘れなく。</p>

<p>さて、プロセスが少し面倒ですが、コード自体は簡単だったと思います。もし何か面白いボットを作った際にはぜひ教えてくださいね！</p>

<p><img src="/wp-content/uploads/2017/02/slack-worked.png" alt="slack-worked" width="200" height="200" class="aligncenter size-full wp-image-22546" srcset="/wp-content/uploads/2017/02/slack-worked.png 200w, /wp-content/uploads/2017/02/slack-worked-150x150.png 150w" sizes="(max-width: 200px) 100vw, 200px" /></p>
]]></content:encoded>
			</item>
		<item>
		<title>SkyWay iOS/Android SDKを使って、WebRTCアプリを開発しよう</title>
		<link>/sho-y/17863/</link>
		<pubDate>Thu, 24 Dec 2015 00:00:53 +0000</pubDate>
		<dc:creator><![CDATA[山村 奨]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[SkyWay]]></category>
		<category><![CDATA[WebRTC]]></category>
		<category><![CDATA[iOS]]></category>

		<guid isPermaLink="false">/?p=17863</guid>
		<description><![CDATA[連載： WebRTCプラットフォーム ”SkyWay” 入門 (5)連載5回目の今回は、12月にアップグレードされたSkyWayのiOS/Android用SDKのチュートリアルをお届けします。 iOS/Android用S...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/skyway-tutorial/" class="series-314" title="WebRTCプラットフォーム ”SkyWay” 入門" data-wpel-link="internal">WebRTCプラットフォーム ”SkyWay” 入門</a> (5)</div><p>連載5回目の今回は、12月にアップグレードされたSkyWayのiOS/Android用SDKのチュートリアルをお届けします。</p>

<p>iOS/Android用SDKを使うことで、SkyWayの特徴である「WebRTCを使ったP2P通信を簡単に実現」することができます。
また、APIもJavaScript版とほぼ同じで、JavaScript版をすでに利用されている方にも実装しやすく、JavaScript/iOS/Android間での通信もサポートしています。</p>

<p>この記事では、そんなiOS/AndroidのSDKの利用方法を、それぞれサンプルアプリのビルド方法や解説を交えながらご紹介していきます。</p>

<p>まずは、iOSのサンプルアプリのビルド方法からご紹介します。Androidのみ開発される方は読み飛ばしてください。</p>

<h2>iOSのサンプルアプリのビルド方法</h2>

<p>まず、まだSkyWayに登録されていない方は<a href="http://nttcom.github.io/skyway/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">SkyWayのサイト</a>から開発者登録を行ってください。その際の利用可能ドメインですが、ドメインをお持ちでない方は「localhost」等、適当な文字列を指定してください。</p>

<p>次に、iOS SDKをダウンロードします。<br />
iOS SDKの<a href="https://github.com/nttcom/SkyWay-iOS-SDK/releases/latest" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ダウンロードページ</a>にアクセスして下さい。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/12/ios_sdk_DL.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/12/ios_sdk_DL.png" alt="iOS SDKのダウンロード方法" width="640" height="622" class="alignnone size-full wp-image-17963" srcset="/wp-content/uploads/2015/12/ios_sdk_DL.png 640w, /wp-content/uploads/2015/12/ios_sdk_DL-300x292.png 300w, /wp-content/uploads/2015/12/ios_sdk_DL-207x201.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>ページ下部のDownloadsからダウンロードして下さい。
解凍したフォルダの中に「SkyWay.framework」というものが入っており、これがiOS SDK本体になります。</p>

<p>次はサンプルアプリプログラムのダウンロードを行います。<br />
SkyWay-iOS-Sampleの<a href="https://github.com/nttcom/SkyWay-iOS-Sample" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">レポジトリ</a>をクローンするかダウンロードを行って下さい。（下図はダウンロードする場合）
<a href="https://html5experts.jp/wp-content/uploads/2015/12/ios_sample_DL.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/12/ios_sample_DL.png" alt="iOSサンプルアプリのダウンロード方法" width="640" height="525" class="alignnone size-full wp-image-17964" srcset="/wp-content/uploads/2015/12/ios_sample_DL.png 640w, /wp-content/uploads/2015/12/ios_sample_DL-300x246.png 300w, /wp-content/uploads/2015/12/ios_sample_DL-207x170.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>次に、サンプルアプリのフォルダにはSDKが含まれていないので、サンプルアプリプロジェクトにSDKを入れます。
<a href="https://html5experts.jp/wp-content/uploads/2015/12/ios_sample_sdkcopy.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/12/ios_sample_sdkcopy.png" alt="iOS SDKのコピー" width="640" height="334" class="alignnone size-full wp-image-17875" srcset="/wp-content/uploads/2015/12/ios_sample_sdkcopy.png 640w, /wp-content/uploads/2015/12/ios_sample_sdkcopy-300x157.png 300w, /wp-content/uploads/2015/12/ios_sample_sdkcopy-207x108.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>先ほどのSkyWay.frameworkを「SkyWay-iOS-Sample &gt; frameworks」内にコピーします。</p>

<p>サンプルアプリを動かすためには、開発者登録をした際のAPIキーとドメインを設定する必要があります。<br />
では、サンプルアプリプロジェクトを開いて設定してみましょう。</p>

<p>SkyWay-iOS-Sample.xcodeprojをXcode（本記事ではVersion 7.1.1）で開き、<br />
SkyWay-iOS-Sample &gt; SkyWay-iOS-Sample内の「DataConnectionViewController.m」を開きます。</p>

<p></p><pre class="crayon-plain-tag">//
// MediaConnectionViewController.m
// SkyWay-iOS-Sample
//

#import "MediaConnectionViewController.h"

#import &lt;AVFoundation/AVFoundation.h&gt;

#import &lt;SkyWay/SKWPeer.h&gt;

#import "AppDelegate.h"
#import "PeersListViewController.h"


// Enter your APIkey and Domain
// Please check this page. &gt;&gt; https://skyway.io/ds/
static NSString *const kAPIkey = @"yourAPIKEY";
static NSString *const kDomain = @"yourDomain";


typedef NS_ENUM(NSUInteger, ViewTag)
{
  TAG_ID = 1000,
  TAG_WEBRTC_ACTION,
  TAG_REMOTE_VIDEO,
  TAG_LOCAL_VIDEO,
};</pre><p></p>

<p>コードの上方部分に、上図のような箇所があるので、ここにAPIキーとドメインを設定して保存しましょう。</p>

<p>「MediaConnectionViewController.m」にも同様の箇所があるため、こちらも修正します。
<a href="https://html5experts.jp/wp-content/uploads/2015/12/ios_sample_Build.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/12/ios_sample_Build.png" alt="iOSサンプルアプリのビルド" width="640" height="492" class="alignnone size-full wp-image-17897" srcset="/wp-content/uploads/2015/12/ios_sample_Build.png 640w, /wp-content/uploads/2015/12/ios_sample_Build-300x231.png 300w, /wp-content/uploads/2015/12/ios_sample_Build-207x159.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>ここまで終わったら、ビルドする端末を接続・選択して、ビルドをします。
以上がiOSのサンプルアプリのビルド方法です。</p>

<p>次はAndroidのサンプルアプリのビルド方法をご紹介します。
iOSのみ開発される方は飛ばしてください。</p>

<h2>Androidのサンプルアプリのビルド方法</h2>

<p>まずはiOSと同じく、まだSkyWayに登録されていない方は<a href="http://nttcom.github.io/skyway/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">SkyWayのサイト</a>から開発者登録を行ってください。その際の利用可能ドメインですが、ドメインをお持ちでない方は「localhost」等、適当な文字列を指定してください。</p>

<p>次に、Android SDKをダウンロードします。<br />
Android SDKの<a href="https://github.com/nttcom/SkyWay-Android-SDK/releases/latest" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ダウンロードページ</a>にアクセスして下さい。
<a href="https://html5experts.jp/wp-content/uploads/2015/12/android_sdk_DL.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/12/android_sdk_DL.png" alt="Android SDKのダウンロード方法" width="640" height="525" class="alignnone size-full wp-image-17966" srcset="/wp-content/uploads/2015/12/android_sdk_DL.png 640w, /wp-content/uploads/2015/12/android_sdk_DL-300x246.png 300w, /wp-content/uploads/2015/12/android_sdk_DL-207x170.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>ページ下部のDownloadsからダウンロードして下さい。
解凍したフォルダの中に「SkyWay.aar」というものが入っており、これがAndroid SDK本体になります。</p>

<p>次はサンプルアプリプログラムのダウンロードを行います。<br />
SkyWay-Android-Sampleの<a href="https://github.com/nttcom/SkyWay-Android-Sample" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">レポジトリ</a>をクローンするかダウンロードを行って下さい。（下図はダウンロードする場合）
<a href="https://html5experts.jp/wp-content/uploads/2015/12/android_sample_DL.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/12/android_sample_DL.png" alt="Androidサンプルアプリのダウンロード方法" width="640" height="525" class="alignnone size-full wp-image-17967" srcset="/wp-content/uploads/2015/12/android_sample_DL.png 640w, /wp-content/uploads/2015/12/android_sample_DL-300x246.png 300w, /wp-content/uploads/2015/12/android_sample_DL-207x170.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>次に、サンプルアプリにはSDKが含まれていないので、サンプルアプリ内にSDKを入れます。
<a href="https://html5experts.jp/wp-content/uploads/2015/12/android_sample_sdkcopy.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/12/android_sample_sdkcopy.png" alt="Android SDKのコピー" width="640" height="377" class="alignnone size-full wp-image-17911" srcset="/wp-content/uploads/2015/12/android_sample_sdkcopy.png 640w, /wp-content/uploads/2015/12/android_sample_sdkcopy-300x177.png 300w, /wp-content/uploads/2015/12/android_sample_sdkcopy-207x122.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>先ほどのSkyWay.aarを「app &gt; libs」内にコピーします。</p>

<p>サンプルアプリを動かすためには、開発者登録をした際のAPIキーとドメインを設定する必要があります。<br />
では、サンプルアプリプロジェクトを開いて設定してみましょう。</p>

<p>サンプルアプリのフォルダををAndroid Studio（本記事ではVersion 1.4）で開き、<br />
app &gt; src &gt; main &gt; java &gt; io.skyway.testpeerjava 内の「DataActivity.java」を開きます。</p>

<p></p><pre class="crayon-plain-tag">package io.skyway.testpeerjava;

import ...   //省略


public class DataActivity
    extends Activity
{
  private static final String TAG = DataActivity.class.getSimpleName();

  private Peer           _peer;
  private DataConnection _data;
  private Handler _handler;
  private String   _id;
  private String[] _listPeerIds;
  private Boolean  _bConnecting;
  private Runnable     _runAddLog;
  private List&lt;String&gt; _aryLogs;
  private Bitmap _image;


  @Override
  protected void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);

    Window wnd = getWindow();
    wnd.addFlags(Window.FEATURE_NO_TITLE);

    setContentView(R.layout.activity_chat);
    _handler = new Handler(Looper.getMainLooper());

    Context context = getApplicationContext();


    //////////////////////////////////////////////////////////////////////
    //////////////////  START: Initialize Peer ///////////////////////////
    //////////////////////////////////////////////////////////////////////


    // connect option
    PeerOption options = new PeerOption();

    // Please check this page. &gt;&gt; https://skyway.io/ds/
    //Enter your API Key and registered Domain.
    options.key = "";
    options.domain = "";

    // PeerOption has many options. Please check the document. &gt;&gt; http://nttcom.github.io/skyway/docs/

    _peer = new Peer(context, options);
    setPeerCallback(_peer);</pre><p></p>

<p>コードの上方部分に、上図のような箇所があるので、ここにAPIキーとドメインを設定して保存しましょう。</p>

<p>「MediaActivity.java」にも同様の箇所があるため、こちらも修正します。
<a href="https://html5experts.jp/wp-content/uploads/2015/12/android_sample_Build.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/12/android_sample_Build.png" alt="Androidサンプルアプリのビルド" width="640" height="471" class="alignnone size-full wp-image-17913" srcset="/wp-content/uploads/2015/12/android_sample_Build.png 640w, /wp-content/uploads/2015/12/android_sample_Build-300x221.png 300w, /wp-content/uploads/2015/12/android_sample_Build-207x152.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>ここまで終わったらビルドを行い、端末を選択します。
以上がAndroidのサンプルアプリのビルド方法です。</p>

<p>では、コードを参考にしながら、簡単にAPIの使い方を見ていきましょう。</p>

<h2>ビデオチャットのコード</h2>

<p>iOSとAndroidの二種類のSDKをご紹介をしましたが、この二つのAPIは細かいところを除いては、ほぼ同じです。また、サンプルアプリのコードもほぼ似通ったものとなっています。<br />
そのため、ここではAndroidのビデオチャットのコードを参考にしながら、簡単にAPIの使い方をご紹介します。</p>

<p>また、WebRTC技術についての説明は割愛します。
詳しいWebRTCの仕組みについては、がねこまさしさんが書かれたコチラの記事をお読みください: <a href="https://html5experts.jp/mganeko/5554/" data-wpel-link="internal">壁を越えろ！WebRTCでNAT/Firewallを越えて通信しよう</a></p>

<p>ではまず、APIの使い方の前に、サンプルアプリの動作を確認します。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/12/android_sample_seq1.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/12/android_sample_seq1.png" alt="android_sample_seq1" width="640" height="569" class="alignnone size-full wp-image-17940" srcset="/wp-content/uploads/2015/12/android_sample_seq1.png 640w, /wp-content/uploads/2015/12/android_sample_seq1-300x267.png 300w, /wp-content/uploads/2015/12/android_sample_seq1-207x184.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/12/android_sample_seq2.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/12/android_sample_seq2.png" alt="android_sample_seq2" width="640" height="569" class="alignnone size-full wp-image-17937" srcset="/wp-content/uploads/2015/12/android_sample_seq2.png 640w, /wp-content/uploads/2015/12/android_sample_seq2-300x267.png 300w, /wp-content/uploads/2015/12/android_sample_seq2-207x184.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>このように、</p>

<ul>
<li>シグナリングサーバ<sup>*1</sup>との接続とPeerIDの取得</li>
<li>自分の映像の取得と表示</li>
<li>PeerIDの一覧取得</li>
<li>選択したPeerIDへの通話呼び出し</li>
<li>相手の映像の取得と表示</li>
</ul>

<p>を行う、とてもシンプルなアプリです。</p>

<p>では、この動作に沿ってコードを見ていきましょう。<br />
まずは、SkyWayとのサーバとの接続です。</p>

<p></p><pre class="crayon-plain-tag">//////////////////////////////////////////////////////////////////////
    //////////////////  START: Initialize SkyWay Peer ////////////////////
    //////////////////////////////////////////////////////////////////////

    // Please check this page. &gt;&gt; https://skyway.io/ds/
    PeerOption options = new PeerOption();

    //Enter your API Key.
    options.key = "";
    //Enter your registered Domain.
    options.domain = "";


    // SKWPeer has many options. Please check the document. &gt;&gt; http://nttcom.github.io/skyway/docs/

    _peer = new Peer(context, options);
    setPeerCallback(_peer);

    //////////////////////////////////////////////////////////////////////
    ////////////////// END: Initialize SkyWay Peer ///////////////////////
    //////////////////////////////////////////////////////////////////////</pre><p></p>

<p>ここではSkyWayのシグナリングサーバとの接続を行っています。</p>

<p>まず、接続を行う時のオプションをPeerOptionクラスで設定します。<br />
このクラスでまず必須なのは、SkyWayを利用するためには必須となる「APIキー」や「ドメイン」の設定です。<br />
そのほかにも、SkyWayが提供するTURNサーバの利用を選択する「turn」プロパティや、自前のSTUN/TURNサーバを設定する「config」プロパティ等の設定が可能です。もっと詳しく知りたい方は<a href="https://nttcom.github.io/skyway/docs/#Android-peeroption" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ドキュメント</a>をご参照ください。</p>

<p>次に16行目では、このオプションを使ってシグナリングサーバと接続を行っています。<br />
このPeerクラスはシグナリングサーバとの接続を管理しており、「connect/call」メソッドでのP2Pのデータ/メディア通信の開始や、「listAllPeers」メソッドでのAPIキー毎のアクティブなPeerIDを取得、などができます。<br />
実際にサンプルアプリでは、「Calling」というボタンを押すとlistAllPeersメソッドを呼び出し、PeerID一覧の取得を行っています。</p>

<p>続いて17行目では、このPeerオプジェクトのコールバックを設定しています。<br />
コールバックの説明の前に、ローカルの映像取得部分を見てみます。</p>

<p></p><pre class="crayon-plain-tag">//////////////////////////////////////////////////////////////////////
    ////////////////// START: Get Local Stream   /////////////////////////
    //////////////////////////////////////////////////////////////////////
    Navigator.initialize(_peer);
    MediaConstraints constraints = new MediaConstraints();
    MediaStream _msLocal = Navigator.getUserMedia(constraints); 

    Canvas canvas = (Canvas) findViewById(R.id.svSecondary);
    canvas.addSrc(_msLocal, 0);

    //////////////////////////////////////////////////////////////////////
    //////////////////// END: Get Local Stream   /////////////////////////
    //////////////////////////////////////////////////////////////////////</pre><p></p>

<p>ここでは、ローカルの映像取得を行って、得た映像ストリームをViewに表示しています。<br />
NavigatorオブジェクトのgetUserMediaメソッドを呼び出すことで、MediaSteamオブジェクトの映像ストリームを得ることができます。その際に、MediaConstraintsというオプションを指定することで、映像/音声の利用可否の指定、インカメラ/アウトカメラの指定、などを行うことができます。</p>

<p>また、CanvasクラスはGLSurfaceViewを継承しており、得た映像ストリームはCanvasオブジェクトのaddSrcメソッドで表示することができます(iOSのSKWVideoオブジェクトはUIViewを継承しています)。</p>

<p>では、話を戻してPeerオブジェクトのコールバックを見てみましょう。</p>

<p></p><pre class="crayon-plain-tag">//////////////////////////////////////////////////////////////////////////////////
    ///////////////////// START: Set SkyWay peer callback   //////////////////////////
    //////////////////////////////////////////////////////////////////////////////////
    // 簡単のため、適宜、省略しています

    // !!!: Event/Open
    peer.on(Peer.PeerEventEnum.OPEN, new OnCallback()
    {
      @Override
      public void onCallback(Object object)
      {
        // シグナリングサーバと接続された
        _id = (String) object;

        updateUI();
      }
    });

    // !!!: Event/Call
    peer.on(Peer.PeerEventEnum.CALL, new OnCallback()
    {
      @Override
      public void onCallback(Object object)
      {
        // 相手から通話がかかってきた
        _media = (MediaConnection) object;

        _media.answer(_msLocal);

        setMediaCallback(_media);

        updateUI();
      }
    });

    // !!!: Event/Close
    peer.on(Peer.PeerEventEnum.CLOSE, new OnCallback()
    {
      @Override
      public void onCallback(Object object)
      {
        // シグナリングサーバとの接続ステータスがdestroyedとなった
      }
    });

    // !!!: Event/Disconnected
    peer.on(Peer.PeerEventEnum.DISCONNECTED, new OnCallback()
    {
      @Override
      public void onCallback(Object object)
      {
        // シグナリングサーバとの接続ステータスがdisconnectedとなった
      }
    });

    // !!!: Event/Error
    peer.on(Peer.PeerEventEnum.ERROR, new OnCallback()
    {
      @Override
      public void onCallback(Object object)
      {
        // 何かしらのエラーが発生した
      }
    });

    //////////////////////////////////////////////////////////////////////////////////
    /////////////////////// END: Set SkyWay peer callback   //////////////////////////
    //////////////////////////////////////////////////////////////////////////////////</pre><p></p>

<p>ここでは、シグナリングサーバから送られたイベントに対し、処理を行っています。</p>

<p>7行目は、シグナリングサーバとの接続が確立した際の「OPEN」イベントでの処理です。<br />
ここでのObjectは、シグナリングサーバから自分に割り当てられたPeerIDが格納されており、サンプルアプリでは、そのPeerIDを表示しています。PeerIDはnew Peer時にIDを指定することもできますし、指定せずにランダムなIDを取得することもできます。</p>

<p>20行目では、他のPeerから通話がかかってきた際の「CALL」イベントでの処理です。<br />
ここでのObjectはMediaConnectionクラスであり、answerメソッドを呼ぶことで、先ほど作成した自分の映像ストリームを返しています。引数を与えないことで、映像ストリームを返さないことも可能です。<br />
そのあと、30行目でMediaConnectionのコールバックを設定しています。</p>

<p>このように、相手からの通話を受ける際は、Peerオブジェクトのコールバック内で「CALL」イベントで処理を行います。<br />
自分から通話する場合は、下記のようにPeerオブジェクトのcallメソッドを呼びます。</p>

<p></p><pre class="crayon-plain-tag">//////////////////////////////////////////////////////////////////////
    ////////////////// START: Calling SkyWay Peer   //////////////////////
    //////////////////////////////////////////////////////////////////////
    // 簡単のため、適宜、省略しています

    CallOption option = new CallOption();

    _media = _peer.call(strPeerId, _msLocal, option);

    setMediaCallback(_media);

    //////////////////////////////////////////////////////////////////////
    /////////////////// END: Calling SkyWay Peer   ///////////////////////
    //////////////////////////////////////////////////////////////////////</pre><p></p>

<p>この部分は、listAllPeersメソッドで得られたPeerIdの一覧から、通話したいPeerIDをタップした時に呼ばれます。</p>

<p>このように、呼び出し時のオプションを設定し（このコードでは何も設定していませんが）、通話をしたいPeerIDと自分の映像ストリームを指定してcallメソッドを実行します。返り値は通話がかかってきた際と同様、MediaConnectionクラスで、MediaConnectionのコールバックを設定しています。</p>

<p>では、MediaConnectionのコールバックを見てみましょう。</p>

<p></p><pre class="crayon-plain-tag">//////////////////////////////////////////////////////////////////////////////////
    //////////////  START: Set SkyWay peer Media connection callback   ///////////////
    //////////////////////////////////////////////////////////////////////////////////
    // 簡単のため、適宜、省略しています

    // !!!: MediaEvent/Stream
    media.on(MediaConnection.MediaEventEnum.STREAM, new OnCallback()
    {
      @Override
      public void onCallback(Object object)
      {
        _msRemote = (MediaStream) object;

        Canvas canvas = (Canvas) findViewById(R.id.svPrimary);
        canvas.addSrc(_msRemote, 0);
      }
    });

    // !!!: MediaEvent/Close
    media.on(MediaConnection.MediaEventEnum.CLOSE, new OnCallback()
    {
      @Override
      public void onCallback(Object object)
      {
        Canvas canvas = (Canvas) findViewById(R.id.svPrimary);
        canvas.removeSrc(_msRemote, 0);

        _msRemote = null;
        _media = null;

        updateUI();
      }
    });

    // !!!: MediaEvent/Error
    media.on(MediaConnection.MediaEventEnum.ERROR, new OnCallback()
    {
      @Override
      public void onCallback(Object object)
      {
        // 何かしらのエラーが発生した
      }
    });

    //////////////////////////////////////////////////////////////////////////////////
    ///////////////  END: Set SkyWay peer Media connection callback   ////////////////
    //////////////////////////////////////////////////////////////////////////////////</pre><p></p>

<p>7行目は、通話相手の映像ストリームを取得した際の「STREAM」イベントでの処理です。ここでのObjectは、MediaStreamオブジェクトです。自分の映像ストリームと同じくCanvasオブジェクトを利用して表示しています。</p>

<p>20行目では、通話相手との通話が切断された際の「CLOSE」イベントでの処理です。</p>

<p>ここまでが、簡単なSkyWayを使ったWebRTCの処理になります。</p>

<p>最後に、最近のアップデートで追加されたメソッドについてご紹介します。</p>

<p></p><pre class="crayon-plain-tag">Button switchCameraAction = (Button)findViewById(R.id.switchCameraAction);
    switchCameraAction.setOnClickListener(new View.OnClickListener()
    {
      @Override
      public void onClick(View v)
      {
        Boolean result = _msLocal.switchCamera();
        if(true == result)
        {
          //Success
        }else
        {
          //Failed
        }
      }
    });</pre><p></p>

<p>MediaStreamオブジェクトがローカルの映像ストリームの場合、switchCameraメソッドを呼び出すことができます。<br />
これにより、今まではできなかった、「getUserMedia後のインカメラ/アウトカメラ切り替え」が可能になります。</p>

<p>以上が、サンプルアプリの簡単なコード解説になります。今回はビデオチャットだけの紹介でしたが、ほぼ同じようなAPIでテキストや画像が送れるデータチャットも可能です。</p>

<h2>おわりに</h2>

<p>今回は、SkyWayのiOS/Android用SDKのチュートリアルをお届けしました。</p>

<p>JavaScript版と同じように、手軽にWebRTCが利用可能です。
是非ご自身のアプリケーションに組み込んでみてください！</p>
]]></content:encoded>
		
		<series:name><![CDATA[WebRTCプラットフォーム ”SkyWay” 入門]]></series:name>
	</item>
		<item>
		<title>SkyWay ScreenShareを使ってWebRTCの画面共有機能を実装しよう</title>
		<link>/yusuke-naka/16445/</link>
		<pubDate>Fri, 28 Aug 2015 00:00:15 +0000</pubDate>
		<dc:creator><![CDATA[仲 裕介]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[SkyWay]]></category>
		<category><![CDATA[WebRTC]]></category>
		<category><![CDATA[Webアプリ]]></category>

		<guid isPermaLink="false">/?p=16445</guid>
		<description><![CDATA[連載： WebRTCプラットフォーム ”SkyWay” 入門 (4)連載4回目の今回は、7月28日にリリースされた、SkyWay ScreenShareのチュートリアルをお届けします。 SkyWay ScreenShar...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/skyway-tutorial/" class="series-314" title="WebRTCプラットフォーム ”SkyWay” 入門" data-wpel-link="internal">WebRTCプラットフォーム ”SkyWay” 入門</a> (4)</div><p>連載4回目の今回は、7月28日にリリースされた、<a href="https://github.com/nttcom/SkyWay-ScreenShare" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">SkyWay ScreenShare</a>のチュートリアルをお届けします。</p>

<p>SkyWay ScreenShareは、WebRTCのWebアプリケーションで画面共有を簡単に実装できるライブラリ、画面共有に必要なChrome・Firefox向けのExtensionが簡単に実装できるソースコードが含まれています。</p>

<h1>画面共有機能の概要</h1>

<p>WebRTCの画面共有機能は、ブラウザ画面やPCのデスクトップ画面をリアルタイムで相手に配信できる機能です。</p>

<div id="attachment_16475" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/08/skyway_ss_sc1.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/08/skyway_ss_sc1-640x262.png" alt="Chromeでの画面共有の様子" width="640" height="262" class="size-large wp-image-16475" srcset="/wp-content/uploads/2015/08/skyway_ss_sc1.png 640w, /wp-content/uploads/2015/08/skyway_ss_sc1-300x123.png 300w, /wp-content/uploads/2015/08/skyway_ss_sc1-207x85.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">Chromeでの画面共有の様子</p></div>

<p>WebRTCの画面共有機能はChrome 34以上または、Firefox 33以上で利用可能です。</p>

<h4>Chromeでの実装</h4>

<p>画面共有機能は、Chrome 26で初めてブラウザに実装されました。当初は、Chromeの<code>chrome://flags</code>から<code>Enable screen capture support in getUserMedia()</code>というフラグをONにし、<code>getUserMedia()</code>のオプションを指定することで、実現できていました。しかし、セキュリティ上の問題からChrome 34でそのフラグが削除され、代わりにChrome Extensionをインストールするか、Chrome Appsからしか利用できなくなりました。</p>

<h4>Firefoxでの実装</h4>

<p>Firefoxについては、Firefox 33から画面共有機能が実装されています。Firefoxの場合は、Chromeとは方式が異なり、<code>about:config</code>の<code>media.getusermedia.screensharing.enabled</code>という設定を<code>true</code>に設定し、<code>media.getusermedia.screensharing.allowed_domains</code>という設定項目に、画面共有機能を許可するWebサイトのドメインを追加することで利用できるようになります。また、<code>media.getusermedia.screensharing.allowed_domains</code>には、Mozillaが許可したサービスのドメインが予め設定されています。こちらにドメインを追加してもらいたい場合は、<a href="https://wiki.mozilla.org/Screensharing" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">このサイト</a>の下部に掲載されているフォームから申請が可能です。（筆者は申請したことはありませんが、恐らく審査があると思われます）</p>

<h4>標準化の状況</h4>

<p>WebRTCのJavaScriptAPIの標準化はW3Cで行われています。この画面共有機能についても、今年の２月に仕様書が作られて標準化が進められています。仕様書は<a href="http://w3c.github.io/mediacapture-screen-share/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">「Screen Capture」</a>です。仕様書についての詳細な解説は割愛しますが、現在、ChromeとFirefoxで実装されている画面共有機能はブラウザベンダごとの独自実装であり、今後実装が変更になる可能性は高いと考えられます。</p>

<h1>SkyWay ScreenShareの使い方〜ビルド編〜</h1>

<p>ここからSkyWay ScreenShareの使い方を説明します。はじめに、<a href="https://github.com/nttcom/SkyWay-ScreenShare/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">github.com/nttcom/SkyWay-ScreenShare</a>からファイル一式をローカル環境にcloneして下さい。また、ここに書いている内容の詳細は<a href="https://github.com/nttcom/SkyWay-ScreenShare/blob/master/README_ja.md" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">README</a>にも掲載していますので、合わせてご覧ください。</p>

<h4>Chrome Extensionの作成</h4>

<p>まずはマニフェストファイルを修正します。JSONファイルのひな形にそって必要な項目を入力して下さい。アイコンファイルも必要です。</p>

<p></p><pre class="crayon-plain-tag">{
  "name": "Your extension name here",
  "short_name": "Your extension short_name here",
  "version": "Your extension version number here",
  "manifest_version": 2,
  "description": "Your extension description here",
  "icons": {
    "16": "icon16.png",
    "48": "icon48.png",
    "128": "icon128.png"
  },
  "permissions": [
    "desktopCapture",
    "tabs"
  ],
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  "content_scripts": [{
    "matches": [""],
    "js": ["content.js"],
    "all_frames": true,
    "run_at": "document_end"
  }]
}</pre><p></p>

<p>尚、ここで重要なのは <code>matches</code>です。ここには、このExtensionのりようを許可するWebサイトのURLを記載します。必ずご自身のWebサイトのURLを指定して下さい。ワイルドカードを利用して複数のURLにマッチさせることも可能ですが、その場合は、あなたのExntensionを他のWebサイトで利用される可能性があります。セキュリティ上もよろしくありません。</p>

<p></p><pre class="crayon-plain-tag">例："matches": ["https://*.skyway.io/*"]</pre><p></p>

<p>次にビルドしましょう。SkyWay-ScreenShareではビルド用のgulpタスクとnpm-scriptでエイリアスコマンドを用意しています。SkyWay-ScreenShareディレクトリの直下で、次の２行のコマンドを実行します。npmコマンドは事前に使えるようにしておいて下さい。</p>

<p></p><pre class="crayon-plain-tag">npm install
npm run build-chrome</pre><p></p>

<p>ビルドが完了したら、出来上がったファイルをChromeに読み込ませましょう。<code>chrome://extensions/</code> にアクセスし、<code>デベロッパーモード</code>を有効にします。そして、<code>パッケージ化されていない拡張機能を読み込む</code>をクリックし、以下のディレクトリを指定します。</p>

<p></p><pre class="crayon-plain-tag">SkyWay-ScreenShare/chrome-extension/screenshare_chrome_extension/</pre><p></p>

<p>読み込むと以下のようになります。（この画像はChromeウェブストアからダウンロードしたものが写っています）</p>

<div id="attachment_16513" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/08/skyway_ss_sc2.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/08/skyway_ss_sc2-640x386.png" alt="Chrome Extensionを読み込みます" width="640" height="386" class="size-large wp-image-16513" srcset="/wp-content/uploads/2015/08/skyway_ss_sc2.png 640w, /wp-content/uploads/2015/08/skyway_ss_sc2-300x181.png 300w, /wp-content/uploads/2015/08/skyway_ss_sc2-207x125.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">Chrome Extensionを読み込みます</p></div>

<p>また、ディレクトリと同一フォルダにある<code>screenshare_chrome_extension.zip</code>は、Chromeウェブストアにアップロードする際に利用できます。</p>

<p>これでChrome Extensionの作成は完了です。</p>

<h4>Firefox Extensionの作成</h4>

<p><small>（注意）SkyWay-ScreenShareのリポジトリには、「Firefox Add-On」という表記で記載しておりますが、画面共有機能を利用するために作成するモノは、Firefox Extension（拡張機能）となります。Add-OnはFirefoxの拡張機能やテーマ等全ての総称となるため、リポジトリの表記とは異なりますが、本記事中では、Firefox Extensionと表記を統一させて頂きます。</small></p>

<p>Firefox Extensionでは、メインプログラムとパッケージファイルの二つを修正します。まずは、メインプログラムです。</p>

<p></p><pre class="crayon-plain-tag">var pageMod = require('sdk/page-mod');
var self = require('sdk/self');
var __temp = require('chrome');
var Cc = __temp.Cc;
var Ci = __temp.Ci;

var domains_to_add = [''];
var addon_domains = [];
var allowed_domains_pref = 'media.getusermedia.screensharing.allowed_domains';
var enable_screensharing_pref = 'media.getusermedia.screensharing.enabled';

 ~~ 省略 ~~</pre><p></p>

<p>ここでは<code>domains_to_add = [''];</code>に、画面共有機能を有効にするWebサイトのドメインを指定して下さい。指定方法は以下のようになります。</p>

<p></p><pre class="crayon-plain-tag">例：domains_to_add = ['*.skyway.io']</pre><p></p>

<p>次にパッケージファイルを修正します。ここではExtensionの基本情報を入力していきます。ひな形にそって必要な情報を入力して下さい。アイコンファイルも必要です。</p>

<p></p><pre class="crayon-plain-tag">{
    "name": "your_add-on_name_here",
    "title": "Your add-on title here",
    "description": "Your add-on description here",
    "author": "Your add-on author here",
    "version": "Your add-on version number here",
    "license": "Your add-on license here",
    "homepage": "Your add-on homepage url here",
    "icon64": "icon64.png",
    "icon": "icon48.png"
}</pre><p></p>

<p>次にFirefox Extensionのビルドに必要なツール「cfx」をインストールします。インストール方法は<a href="https://dev.mozilla.jp/addon-sdk-docs/dev-guide/tutorials/installation.html" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">この</a>サイトを参考にして下さい。</p>

<p>ツールのインストールが完了したら、まずはプレビルド（pre build）を行います。ExtensionをビルドするためにはランダムなIDを予めパッケージファイルに記載しておく必要があるため、初回のプレビルドで、パッケージファイルにIDを挿入しています。</p>

<p></p><pre class="crayon-plain-tag">npm install
npm run pre-build-firefox</pre><p></p>

<p>初回のプレビルドでIDが挿入された場合、以下の様なエラーが発生します。これは問題ありません。</p>

<p></p><pre class="crayon-plain-tag">No 'id' in package.json: creating a new ID for you.
package.json modified: please re-run 'cfx xpi'</pre><p></p>

<p>再度以下の通り、ビルドを行って下さい。</p>

<p></p><pre class="crayon-plain-tag">npm run build-firefox</pre><p></p>

<p>ビルドが完了したら、Firefoxに読み込ませて動作確認を行いましょう。<code>about://addons</code>にアクセスし、作成したExtension本体である、<code>SkyWay-ScreenShare/firefox-addon/screenshare_firefox_addon.xpi</code>をドラッグ・アンド・ドロップさせます。</p>

<div id="attachment_16512" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/08/skyway_ss_sc3.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/08/skyway_ss_sc3-640x484.png" alt="Firefox Extensionを読み込みます" width="640" height="484" class="size-large wp-image-16512" srcset="/wp-content/uploads/2015/08/skyway_ss_sc3.png 640w, /wp-content/uploads/2015/08/skyway_ss_sc3-300x227.png 300w, /wp-content/uploads/2015/08/skyway_ss_sc3-207x157.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">Firefox Extensionを読み込みます</p></div>

<p>Firefox Extensionの配布は、通常のWebサーバ上に上記xpiファイルを設置し行って下さい。</p>

<p>これでFirefox Extensionの作成は完了です。</p>

<h4>JavaScriptライブラリの作成</h4>

<p>SkyWay-ScreenShareには今まで作成したExtensionを利用するためのJavaScriptライブラリ「screenshare.js」が同梱されています。自分でビルドする場合は、以下のように行って下さい。</p>

<p></p><pre class="crayon-plain-tag">npm install
npm run build-library</pre><p></p>

<p>ビルドに成功すると、以下の通りライブラリが生成されます。</p>

<p></p><pre class="crayon-plain-tag">SkyWay-ScreenShare/dist/screenshare.js
SkyWay-ScreenShare/dist/screenshare.min.js</pre><p></p>

<p>また、ライブラリはCDNでも提供しています。</p>

<p></p><pre class="crayon-plain-tag">&lt;script src="https://skyway.io/dist/screenshare.js"&gt;&lt;/script&gt;
&lt;script src="https://skyway.io/dist/screenshare.min.js"&gt;&lt;/script&gt;</pre><p></p>

<p>最後に、ライブラリの修正や機能追加などは大歓迎です。TypeScriptのソースファイルを同梱していますので、その際はご利用下さい。Pull Reqestもお待ちしています！</p>

<h1>SkyWay ScreenShareの使い方〜アプリ開発編〜</h1>

<p>ExtensionとJavaScriptライブラリの準備ができたところで、同梱している<a href="https://github.com/nttcom/SkyWay-ScreenShare/blob/master/sample" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">サンプルアプリケーション</a>を例に、画面共有機能を使ったアプリの開発方法をご紹介します。</p>

<p>まず、newでオブジェクトを作成します。debugオプションを指定するとコンソールログにデバッグログが出力されます。</p>

<p></p><pre class="crayon-plain-tag">// スクリーンキャプチャの準備
var screen = new SkyWay.ScreenShare({debug: true});</pre><p></p>

<p>次に、<code>startScreenShare()メソッド</code>を利用して、画面共有機能を開始するためのコードを実装していきます。このメソッドの第一引数には、取得する映像の縦横サイズとフレームレートを指定します。第二引数のコールバック関数は、正しく取得できた場合に呼ばれ引数として<code>Stream Object</code>が返ってきます。これをVideo要素に入れてあげれば画面が表示されます。</p>

<p>また、第四引数についてはChromeのみ利用できるオプショナルなコールバック関数で、画面共有が何らかの方法で終了した場合に呼ばれます。Firefoxでは現状終了検知が出来ないため、Chrome限定です。</p>

<p><code>screen.isEnabledExtension()</code> はExtensionが利用しているブラウザで有効かどうか（インストール済みかどうかも含めて）を判定します。</p>

<p></p><pre class="crayon-plain-tag">// スクリーンシェアを開始
$('#start-screen').click(function () {
	if(screen.isEnabledExtension()){
			screen.startScreenShare({
					Width: $('#Width').val(),
					Height: $('#Height').val(),
					FrameRate: $('#FrameRate').val()
			},function (stream){
					$('#my-video').prop('src', URL.createObjectURL(stream));
					if(existingCall != null){
							var _peerid = existingCall.peer;
							existingCall.close();
							var call = peer.call(_peerid, stream);
							step3(call);
					}
					localStream = stream;

			},function(error){
					console.log(error);
			},function(){
					alert('ScreenShareを終了しました');
			});
	}else{
			alert('ExtensionまたはAddonをインストールして下さい');
	}

});</pre><p></p>

<p>次に、画面共有をプログラム側で終了させる場合のコードを実装していきます。現在は終了のための専用メソッドは用意していません。先ほど取得した<code>Stream Object</code>を保持しておき、終了したいタイミングで<code>stop()メソッド</code>を読んで下さい。これで、画面共有が止まります。いずれ、<code>Stream Object</code>の管理機能を実装する予定なので、その時には専用のメソッドを用意します。</p>

<p></p><pre class="crayon-plain-tag">// スクリーンシェアを終了
$('#stop-screen').click(function () {
	localStream.stop();
});</pre><p></p>

<p>アプリ開発方法の紹介は以上です。</p>

<h1>おわりに</h1>

<p>今回は、SkyWay-ScreenShareを使った、WebRTCの画面共有機能の実装方法をご紹介しました。画面共有機能は様々なユースケースで活用できる機能ですので、是非ご自身のアプリケーションに組み込んでみてください！</p>

<p>次回は、同じく7月28日にリリースされたSkyWay-DrivingVehicleについてのチュートリアルをお届けいたします。</p>
]]></content:encoded>
		
		<series:name><![CDATA[WebRTCプラットフォーム ”SkyWay” 入門]]></series:name>
	</item>
		<item>
		<title>SkyWay音声認識機能を使ってみよう！</title>
		<link>/iwase/16439/</link>
		<pubDate>Wed, 26 Aug 2015 00:00:22 +0000</pubDate>
		<dc:creator><![CDATA[岩瀬 義昌]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[SkyWay]]></category>
		<category><![CDATA[WebRTC]]></category>
		<category><![CDATA[Webアプリ]]></category>

		<guid isPermaLink="false">/?p=16439</guid>
		<description><![CDATA[連載： WebRTCプラットフォーム ”SkyWay” 入門 (3)連載3回目の今回は、SkyWayの付加機能としてリリースされているSkyWay音声認識機能の利用方法についてお届けいたします。SkyWay音声認識機能と...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/skyway-tutorial/" class="series-314" title="WebRTCプラットフォーム ”SkyWay” 入門" data-wpel-link="internal">WebRTCプラットフォーム ”SkyWay” 入門</a> (3)</div><p>連載3回目の今回は、SkyWayの付加機能としてリリースされているSkyWay音声認識機能の利用方法についてお届けいたします。SkyWay音声認識機能とは、クライアント（ブラウザ側）でマイク等を通じて入力した自由発話音声を、サーバ（SkyWay側）と連携して、文字列として受け取る機能のことです。いますぐ試してみたい方は、<a href="https://nttcom.github.io/SkyWay-SpeechRec/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">デモサイト</a>から試用可能です。(注：WebSocketが疎通する環境でないと、正常に動作しません)</p>

<p>同様の機能を実現するAPIとして、Speech Recognition APIがありますが、<a href="http://caniuse.com/#feat=speech-recognition" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">caniuse.com</a>でも示されるように対応するブラウザが限定されています。SkyWay音声認識機能では、標準では対応していないFirefox等のブラウザも対応可能です。</p>

<h2>準備</h2>

<p>以降で記載するサンプルコードの中で、SkyWayが提供しているAPIキーが必要となります。実際にお手元で試される場合は、<a href="http://nttcom.github.io/skyway/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">SkyWay公式サイト</a>から開発者登録を行ってください。本記事のサンプルで利用するには、利用可能ドメインに「localhost」と書いた、APIキーを取得する必要があります。</p>

<h2>今回作成するサンプル</h2>

<p>作成するサンプルは、「音声認識を開始するボタン」と「認識結果を表示するエリア」の2要素のみで構成するシンプルな音声認識アプリケーションです。</p>

<p>スクリーンショットはこちらです。</p>

<div id="attachment_16440" style="width: 583px" class="wp-caption alignnone"><a href="https://html5experts.jp/wp-content/uploads/2015/08/Screen-Shot-2015-08-11-at-11.40.08.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/08/Screen-Shot-2015-08-11-at-11.40.08.png" alt="SkyWay音声認識スクリーンショット" width="573" height="212" class="size-full wp-image-16440" srcset="/wp-content/uploads/2015/08/Screen-Shot-2015-08-11-at-11.40.08.png 573w, /wp-content/uploads/2015/08/Screen-Shot-2015-08-11-at-11.40.08-300x111.png 300w, /wp-content/uploads/2015/08/Screen-Shot-2015-08-11-at-11.40.08-207x77.png 207w" sizes="(max-width: 573px) 100vw, 573px" /></a><p class="wp-caption-text">SkyWay音声認識スクリーンショット</p></div>

<p>こちらを構成しているサンプルコードは以下の通りです。</p>

<p></p><pre class="crayon-plain-tag">&lt;!DOCTYPE html&gt;
&lt;html lang="ja"&gt;
&lt;head&gt;
	&lt;title&gt;SkyWay Speech Recognition Sample&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;!-- 音声認識開始用のボタン、および結果表示用のエリア --&gt;
&lt;button id="start_rec"&gt;start&lt;/button&gt;
&lt;div id="result"&gt;&lt;/div&gt;

&lt;!-- 必要なライブラリ群の読み込み  --&gt;
&lt;script src="https://code.jquery.com/jquery-1.11.3.min.js"&gt;&lt;/script&gt;
&lt;script src="https://skyway.io/dist/msgpack.codec.js"&gt;&lt;/script&gt;
&lt;script src="https://skyway.io/dist/libspeexdsp.js"&gt;&lt;/script&gt;
&lt;script src="https://skyway.io/dist/resampler.min.js"&gt;&lt;/script&gt;
&lt;script src="https://skyway.io/dist/speechrec.min.js"&gt;&lt;/script&gt;

&lt;!-- 音声認識用のコードサンプル --&gt;
&lt;script&gt;
SpeechRec.config({
   'SkyWayKey':'3969c30a-2789-4e46-9155-79a188256633',
   'OpusWorkerUrl':'libopus.worker.js'
});

$("#start_rec").click(function(){
	SpeechRec.start();
	console.log("音声認識を開始します");
});

SpeechRec.on_proc(function(info){
	console.log(info.volume);
});

SpeechRec.on_result(function(result){
    console.log(result.candidates);
    $("#result").text(result.candidates[0].speech);
});
&lt;/script&gt;

&lt;/body&gt;
&lt;/html&gt;</pre><p></p>

<p>上記HTMLを任意の名前で保存してください。本記事ではsample.htmlという名前で保存します。また、htmlを格納するディレクトリと同じ階層に</p>

<ul>
<li><a href="https://skyway.io/dist/libopus.js" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">libopus.js</a></li>
<li><a href="https://skyway.io/dist/libopus.worker.js" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">libopus.worker.js</a></li>
</ul>

<p>の2ファイルを保存して置いてください。音声認識に必要なライブラリとなります。　</p>

<h2>動かしてみよう</h2>

<p>既にApacheやNginxをインストールされている場合はそちらも活用できますが、今回はpythonからシンプルなWebサーバを起動してみます。コマンドは<code>python -m SimpleHTTPServer</code>です。</p>

<p>localhostの8000番でWebサーバが起動するので、<code>http://localhost:8000/sample.html</code>へ、Chrome/Firefox/Operaのいずれかでアクセスしてみましょう。画面が表示されたら、「start」ボタンをクリックすると、マイク使用許可確認のポップアップが表示されますので、Allow/許可を押下します。その後に自由に発話して、適当なタイミングで発話をやめてください。音声認識結果が上手くいくと、数秒以内に音声認識結果の文字列が表示されます。</p>

<h2>コードのポイント解説</h2>

<p>SkyWay音声認識機能を利用するためには、大きく分けて2つの処理が必要になります。</p>

<h3>1. コンフィグの設定・コールバックの設定</h3>

<p>まず<code>SpeechRec.config</code>関数を利用して、SkyWayKeyおよびlibopus.worker.jsへのパスを設定します。サンプルでは、以下のようにconfigを設定しています。</p>

<p></p><pre class="crayon-plain-tag">SpeechRec.config({
   'SkyWayKey':'3969c30a-2789-4e46-9155-79a188256633',
   'OpusWorkerUrl':'libopus.worker.js'
});</pre><p></p>

<p><code>SpeechRec.config</code>には、その他のパラメータも設定可能であり、<a href="https://github.com/nttcom/SkyWay-SpeechRec/blob/gh-pages/README.md#speechrecconfig" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ドキュメント</a>から確認できます。</p>

<p>次に各種コールバックの設定をします。サンプルでは2種類のコールバックを設定しています。</p>

<p></p><pre class="crayon-plain-tag">SpeechRec.on_proc(function(info){
	console.log(info.volume);
});

SpeechRec.on_result(function(result){
    console.log(result.candidates);
    $("#result").text(result.candidates[0].speech);
});</pre><p></p>

<p>1つ目の<code>on_proc</code>は、発話時の音声ボリュームを取得できた場合に発火するコールバック関数です。サンプルでは、コンソール画面に音量を表示するようにしています。</p>

<p>2つ目の<code>on_result</code>は、音声認識結果を取得できた場合に発火するコールバック関数です。サンプルでは、結果をコンソール画面に表示する処理、および<code>#result</code>で指定されるdivエリアに、音声認識結果を書き込む処理をしています。</p>

<p>サンプルでは分かりやすいように、コールバックを2つのみしか設定していませんが、実際にはさらに多くのコールバックを設定可能です。詳細は<a href="https://github.com/nttcom/SkyWay-SpeechRec/blob/gh-pages/README.md#コールバック関数一覧" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">コールバック関数一覧</a>をご確認ください。</p>

<h3>2. 開始・停止の実行</h3>

<p>コンフィグおよびコールバックの設定が完了したら、実際に音声認識を開始・停止するための関数を呼び出します。サンプルでは、<code>#start_rec</code>ボタンがクリックされた際に呼び出す<code>SpeechRec.start</code>が、音声認識を開始するための処理に該当します。</p>

<p></p><pre class="crayon-plain-tag">$("#start_rec").click(function(){
	SpeechRec.start();
	console.log("音声認識を開始します");
});</pre><p></p>

<p>なお、開始だけではなく任意のタイミングで音声認識を終了させる<code>SpeechRec.stop</code>等もあります(サンプルでは省略)。その他の関数は<a href="https://github.com/nttcom/SkyWay-SpeechRec#音声認識制御用関数の一覧" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ドキュメント</a>から確認いただけます。</p>

<h2>おわりに</h2>

<p>いかがでしたでしょうか。今回はSkyWayの付加機能である、音声認識機能について解説いたしました。</p>

<p>次回は画面共有を簡単に実現するSkyWayScreenShareライブラリについてお届けします。</p>
]]></content:encoded>
		
		<series:name><![CDATA[WebRTCプラットフォーム ”SkyWay” 入門]]></series:name>
	</item>
		<item>
		<title>SkyWay MultiPartyを使ってグループチャットを作ろう</title>
		<link>/sakkuru/16397/</link>
		<pubDate>Mon, 24 Aug 2015 00:00:21 +0000</pubDate>
		<dc:creator><![CDATA[本間 咲来]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[SkyWay]]></category>
		<category><![CDATA[WebRTC]]></category>
		<category><![CDATA[Webアプリ]]></category>

		<guid isPermaLink="false">/?p=16397</guid>
		<description><![CDATA[連載： WebRTCプラットフォーム ”SkyWay” 入門 (2)連載2回目の今回は、7月28日にリリースされたライブラリ、SkyWay MultiPartyのチュートリアルをお届けします。 SkyWay MultiP...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/skyway-tutorial/" class="series-314" title="WebRTCプラットフォーム ”SkyWay” 入門" data-wpel-link="internal">WebRTCプラットフォーム ”SkyWay” 入門</a> (2)</div><p>連載2回目の今回は、7月28日にリリースされたライブラリ、SkyWay MultiPartyのチュートリアルをお届けします。
SkyWay MultiPartyは、一言で言うと多人数によるビデオ・テキストチャットを『簡単に』作るためのライブラリです。</p>

<p>本ライブラリを使用することで、グループビデオチャットやテキストチャットを、
ほんの20行程度のJavaScriptコードで実装をすることができます。</p>

<p>サンプルコードを用意していますので、手元で実行しながら進めてみましょう。</p>

<h2>10行ビデオチャット</h2>

<p>以下のスクリーンショットをご覧ください。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/08/video-top.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/08/video-top-640x464.png" alt="videoチャットサンプル" width="640" height="464" class="alignnone size-large wp-image-16407" srcset="/wp-content/uploads/2015/08/video-top.png 640w, /wp-content/uploads/2015/08/video-top-300x218.png 300w, /wp-content/uploads/2015/08/video-top-207x150.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>まずはこのような複数人が参加できるビデオチャットシステムを、10行程度のJavaScriptコードで実装してみましょう。
サンプルコードを以下に記載します。</p>

<p></p><pre class="crayon-plain-tag">&lt;!doctype html&gt;
&lt;html&gt;
&lt;head&gt;
  &lt;script src="https://code.jquery.com/jquery-1.11.3.min.js"&gt;&lt;/script&gt;
  &lt;script src="https://skyway.io/dist/0.3/peer.min.js"&gt;&lt;/script&gt;
  &lt;script src="https://skyway.io/dist/multiparty.min.js"&gt;&lt;/script&gt;
  
  &lt;style&gt; video { width:200px; } &lt;/style&gt;

&lt;/head&gt;
&lt;body&gt;

  &lt;div id="streams"&gt;&lt;/div&gt;

&lt;script&gt;

  // MultiParty インスタンスを生成
  multiparty = new MultiParty( {
    "key": "********-****-****-****-************"  /* SkyWay keyを指定 */
  });

  multiparty.on('my_ms', function(video) {
    // 自分のvideoを表示
    var vNode = MultiParty.util.createVideoNode(video);
    $(vNode).appendTo("#streams");
  }).on('peer_ms', function(video) {
    // peerのvideoを表示
    var vNode = MultiParty.util.createVideoNode(video);
    $(vNode).appendTo("#streams");
  }).on('ms_close', function(peer_id) {
    // peerが切れたら、対象のvideoノードを削除する
    $("#"+peer_id).remove();
  });

  // サーバとpeerに接続
  multiparty.start()

&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</pre><p></p>

<p>早速動かしてみましょう。</p>

<p>上のコードを、<code>videochat.html</code>という名前で保存します。</p>

<p>19行目でSkyWayのAPIキーが必要となりますので、使用する際は<a href="http://nttcom.github.io/skyway/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">SkyWay</a>から開発者登録を行ってください。
本サンプルで使用するには、利用可能ドメインに『localhost』と書いて、APIキーを取得する必要があります。</p>

<p>PCにApacheやNginxなどのサーバがインストールされている場合は、そちらで動かしても問題ありませんが、
入っていない場合は、以下の様にPythonのコマンドでWebサーバを起動できます。</p>

<p></p><pre class="crayon-plain-tag">python -m SimpleHTTPServer</pre><p></p>

<p>localhostの8000番ポートでWebサーバが起動するので、Chrome、Firefox、Operaのいずれかのブラウザでアクセスしてみましょう。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/08/video1.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/08/video1-640x464.png" alt="videoチャットサンプル" width="640" height="464" class="alignnone size-large wp-image-16406" srcset="/wp-content/uploads/2015/08/video1.png 640w, /wp-content/uploads/2015/08/video1-300x218.png 300w, /wp-content/uploads/2015/08/video1-207x150.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>次に別のタブやブラウザで、もう2、3個同じページを開いてみます。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/08/video-all.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/08/video-all-640x309.png" alt="複数人のグループvideoチャット" width="640" height="309" class="alignnone size-large wp-image-16404" srcset="/wp-content/uploads/2015/08/video-all.png 640w, /wp-content/uploads/2015/08/video-all-300x145.png 300w, /wp-content/uploads/2015/08/video-all-207x100.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>複数人参加のビデオチャットが実装できていることがわかります。</p>

<h2>ビデオチャットのコード</h2>

<p>それではコードを見てみましょう。</p>

<p>今回はjQueryを使用するので、4行目でjQueryを読み込んでいます。
(SkyWay MultiPartyを使用するのにjQueryが必須というわけではありません)
5行目と6行目で、SkyWayライブラリ(peer.min.js)とSkyWay MultiPartyライブラリ(multiparty.min.js)を読み込んでいます。
13行目で、ビデオを表示するためのdivを1つ用意しています。</p>

<p>18〜33行目がJavaScriptコードです。大きくMultiPartyオブジェクトの生成部分と、イベントハンドラ部分に分かれています。</p>

<p>SkyWay MultiPartyでは、最初にコンストラクタを呼ぶことで MultiPartyオブジェクトを生成します。引数にはAPIキーが必要となります。</p>

<p></p><pre class="crayon-plain-tag">// MultiParty インスタンスを生成
  multiparty = new MultiParty( {
    "key": "********-****-****-****-************"  /* SkyWay keyを指定 */
  });</pre><p></p>

<p>続くコードがmultipartyオブジェクトのイベントハンドラになります。</p>

<p></p><pre class="crayon-plain-tag">multiparty.on('my_ms', function(video) {
    // 自分のvideoを表示
    var vNode = MultiParty.util.createVideoNode(video);
    $(vNode).appendTo("#streams");

  }).on('peer_ms', function(video) {
    // peerのvideoを表示
    var vNode = MultiParty.util.createVideoNode(video);
    $(vNode).appendTo("#streams");

  }).on('ms_close', function(peer_id) {
    // peerが切れたら、対象のvideoノードを削除する
    $("#"+peer_id).remove();
  });</pre><p></p>

<p>SkyWay MultiPartyでは、</p>

<p></p><pre class="crayon-plain-tag">multiparty.on('イベント名', コールバック関数)</pre><p></p>

<p>の形式で、イベントハンドラを設定することができます。</p>

<p>サンプルでは3つのイベントに対し、ハンドラを定義していることがわかります。</p>

<p>1つ目が<code>'my_ms'</code>で、これは自分のメディアストリームの準備が整った際に発生するイベントです。メディアストリームとは取得した映像や音声を扱うためのオブジェクトで、例えばPCのカメラやマイクから取得した映像・音声がこれにあたります。
コールバックとして呼ばれる関数には、メディアストリームから生成したオブジェクトURLとidがオブジェクトとして渡されます。
ライブラリにはそのオブジェクトからvideoノードを生成するユーティリティが用意されていますので、それを使用しvideoノードを生成・表示しています。</p>

<p>2つ目は、<code>'peer_ms'</code>というイベントに対するコールバックで、これはチャットの相手(peer)のメディアストリームを取得する準備が整った際に発生するイベントです。
こちらも自分のメディアストリームと場合と同様、videoノードを生成・表示しています。</p>

<p>3つ目のイベントは<code>'ms_close'</code>で、peerのメディアストリームの切断を検知した際に発生します。
このコールバックでは、peerのvideoノードを削除する処理を書いています。</p>

<p>以上で、ビデオチャット機能を実装することができました。</p>

<h2>10行テキストチャット</h2>

<p>続いてテキストチャット機能も実装してみましょう。</p>

<p>まず、テキストの入力と表示を行うためのHTML要素を追加します。
以下のコードを『&lt;div id=&quot;streams&quot;&gt;&lt;/div&gt;』の下に追加してみましょう。</p>

<p></p><pre class="crayon-plain-tag">&lt;div&gt;
    &lt;form&gt;
      &lt;input type="text"&gt;&lt;button type="submit"&gt;send&lt;/button&gt;
    &lt;/form&gt;
    &lt;div id="message"&gt;&lt;/div&gt;
  &lt;/div&gt;</pre><p></p>

<p>次に、以下のJavaScriptコードを、『&lt;/script&gt;』の前に追加します。</p>

<p></p><pre class="crayon-plain-tag">//テキストを入力し、submitしたとき
  $("form").on("submit", function(ev) {

    //onsubmitのデフォルト動作（reload）を抑制
    ev.preventDefault();

    //テキストを取得
    var $input = $(this).find("input[type=text]"); 
    var data = $input.val();
    $input.val("");

    //テキストを表示
    $("#message").append(data + "&lt;br&gt;");

    //peerにメッセージを送信
    multiparty.send(data);

  });

  // peerからテキストメッセージを受信したとき
  multiparty.on('message', function(mesg) {
    $("#message").append(mesg.data + "&lt;br&gt;");
  });</pre><p></p>

<p>それでは先ほどのページをリロードしてみましょう。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/08/text11.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/08/text11-640x536.png" alt="textチャットサンプル" width="640" height="536" class="alignnone size-large wp-image-16416" srcset="/wp-content/uploads/2015/08/text11.png 640w, /wp-content/uploads/2015/08/text11-300x251.png 300w, /wp-content/uploads/2015/08/text11-207x173.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>入力フォームが追加されたことがわかります。
文字を入力し、エンターキーを押すと、そのテキストが表示されます。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/08/text-all.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/08/text-all-640x382.png" alt="複数人のグループチャット" width="640" height="382" class="alignnone size-large wp-image-16403" srcset="/wp-content/uploads/2015/08/text-all.png 640w, /wp-content/uploads/2015/08/text-all-300x179.png 300w, /wp-content/uploads/2015/08/text-all-207x124.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>他のタブや、ブラウザから入力したテキストも表示できることが確認できます。</p>

<h2>テキストチャットのコード</h2>

<p>それではコードを見てみましょう。
テキストチャットのコードは、データを送信する際の処理と、データを受信する際の処理に分かれています。</p>

<p>以下のコードで、テキストが入力され、送信されるまでの処理を記述しています。</p>

<p></p><pre class="crayon-plain-tag">//テキストを入力し、submitしたとき
$("form").on("submit", function(ev) {

  //onsubmitのデフォルト動作（reload）を抑制
  ev.preventDefault();

  //テキストを取得
  var $input = $(this).find("input[type=text]"); 
  var data = $input.val();
  $input.val("");

  //テキストを表示
  $("#message").append(data + "&lt;br&gt;");

  //peerにメッセージを送信
  multiparty.send(data);

});</pre><p></p>

<p>multiparty.send()で、テキストをそのまま送信していることがわかります。</p>

<p>そして以下の部分で、メッセージを受信した際に発生するイベント<code>'message'</code>に対する、コールバックを設定しています。</p>

<p></p><pre class="crayon-plain-tag">// peerからテキストメッセージを受信したとき
multiparty.on('message', function(mesg) {
  $("#message").append(mesg.data + "&lt;br&gt;");
});</pre><p></p>

<p>簡易ではありますが、テキストチャットを実現することができました。</p>

<h3>おわりに</h3>

<p>今回は、SkyWay MultiPartyを使ったビデオ・テキストチャットの作り方をお届けしました。
少しのコードで簡単に実装できることがお分かりいただけたかと思います。</p>

<p>次回は、同じく7月28日にリリースされたSkyWay音声認識APIについてのチュートリアルをお届けいたします。</p>
]]></content:encoded>
		
		<series:name><![CDATA[WebRTCプラットフォーム ”SkyWay” 入門]]></series:name>
	</item>
		<item>
		<title>ビデオチャット＆テキストチャット作成チュートリアル！WebRTCを簡単＆柔軟に使える「SkyWay」を使ってみよう</title>
		<link>/katsura/16331/</link>
		<pubDate>Thu, 06 Aug 2015 00:00:06 +0000</pubDate>
		<dc:creator><![CDATA[桂健太]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[システム開発]]></category>
		<category><![CDATA[SkyWay]]></category>
		<category><![CDATA[WebRTC]]></category>
		<category><![CDATA[Webアプリ]]></category>

		<guid isPermaLink="false">/?p=16331</guid>
		<description><![CDATA[連載： WebRTCプラットフォーム ”SkyWay” 入門 (1)WebRTCを簡単に利用するためのプラットフォームSkyWayをご存知ですか？本連載では、WebRTCを簡単に利用するためのプラットフォームSkyWay...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/skyway-tutorial/" class="series-314" title="WebRTCプラットフォーム ”SkyWay” 入門" data-wpel-link="internal">WebRTCプラットフォーム ”SkyWay” 入門</a> (1)</div><p>WebRTCを簡単に利用するためのプラットフォームSkyWayをご存知ですか？本連載では、WebRTCを簡単に利用するためのプラットフォームSkyWayについて、基本的なチュートリアルから、各種ライブラリの紹介までしていきます。</p>

<p>連載第1回目である今回は、まず、WebRTCの基本的な説明をした後に、実際にSkyWayを使って、ビデオチャットの作成とデータチャンネルを使ったチャットの作成をしていきます。</p>

<h2>WebRTCとは</h2>

<p>WebRTCとは、ブラウザやアプリ間でビデオや音声、データのやり取りをP2P(Peer to Peer)で行うことを可能にする規格です。
従来のビデオチャットは互換性のない独自技術で実装されていましたが、WebRTCはオープン標準として仕様が作成・公開されており、相互接続が保証されています。</p>

<p>また、ブラウザで動作することから特別なアプリケーションをインストールする必要がありませんし、すでにあるウェブアプリケーションに埋め込むことで、シームレスにビデオチャットを動かすこともできます。さらに、オープンソースのコードを利用することで、ブラウザだけに限らず、ネイティブアプリにWebRTCを組み込むことも可能です。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/07/image_webrtc.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/07/image_webrtc.png" alt="image_webrtc" width="640" height="193" class="alignnone size-full wp-image-16352" srcset="/wp-content/uploads/2015/07/image_webrtc.png 640w, /wp-content/uploads/2015/07/image_webrtc-300x90.png 300w, /wp-content/uploads/2015/07/image_webrtc-207x62.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<h2>WebRTCの仕組み</h2>

<p>WebRTCはビデオ等のデータをP2Pでやり取りすることが出来ますが、実際にブラウザ間で直接接続をするためには、まず、互いに自分のIPアドレス／ポート番号等の情報を教え合わなければなりません。一般的に、この情報交換を行うためにシグナリングサーバというサーバを用意する必要があります。
<div id="attachment_16353" style="width: 650px" class="wp-caption alignnone"><a href="https://html5experts.jp/wp-content/uploads/2015/07/skyway_signaling.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/07/skyway_signaling-640x226.png" alt="交換する情報はIPアドレス、ポート番号以外にもいくつかあります。" width="640" height="226" class="size-large wp-image-16353" srcset="/wp-content/uploads/2015/07/skyway_signaling.png 640w, /wp-content/uploads/2015/07/skyway_signaling-300x106.png 300w, /wp-content/uploads/2015/07/skyway_signaling-207x73.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">※交換する情報はIPアドレス、ポート番号以外にもいくつかあります。</p></div></p>

<p>また、お互いがNATの内側に存在する場合やFirewallの内側にいる場合、シグナリングサーバだけでは接続することができません。そのために利用するのが、STUN／TURNサーバです。ここでは具体的な説明は省略しますが、作成したアプリケーションをユーザに広く使ってもらうためには、これらのサーバも用意する必要があります。</p>

<p>(詳細を知りたい方は、がねこまさしさんが書かれたコチラの記事をお読みください: <a href="https://html5experts.jp/mganeko/5554/" target="_blank" data-wpel-link="internal">壁を越えろ！WebRTCでNAT/Firewallを越えて通信しよう</a>)</p>

<h2>SkyWayとは</h2>

<p>今までの説明を見てWebRTCは「大変そうだ」と思った方は多いと思います。実際、シグナリングサーバやSTUN/TURNサーバを用意するのは容易ではないです。</p>

<p>そこで登場するのがWebRTC開発者向けプラットフォーム「SkyWay」です。SkyWayは、以下の図で示す通り、複雑なシグナリング処理を担うAPI郡とJavascriptライブラリ／Android,iOSライブラリ、STUN/TURNサーバで構成されています。</p>

<p>このSkyWayを利用することで、シグナリングサーバやSTUN/TURNサーバを独自に用意する必要はなく、開発者はP2P通信部分のプログラミングにのみ集中することができます。</p>

<h2>利用者登録が必要です</h2>

<p>SkyWayは現在トライアルサービス中で、誰でも無料で使うことができます。さっそくウェブサイトから利用者登録をしてみましょう。</p>

<p><a href="http://skyway.io/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">http://skyway.io/</a></p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/07/ss01.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/07/ss01.png" alt="ss01" width="640" height="445" class="alignnone size-full wp-image-16355" srcset="/wp-content/uploads/2015/07/ss01.png 640w, /wp-content/uploads/2015/07/ss01-300x209.png 300w, /wp-content/uploads/2015/07/ss01-207x144.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>「登録を行う」ボタンをクリックして、開発者登録画面に向かいます。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/07/ss02.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/07/ss02.png" alt="ss02" width="640" height="445" class="alignnone size-full wp-image-16356" srcset="/wp-content/uploads/2015/07/ss02.png 640w, /wp-content/uploads/2015/07/ss02-300x209.png 300w, /wp-content/uploads/2015/07/ss02-207x144.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>必要事項を入力します。ここで入力するドメイン名は、セキュリティ向上を目的として行っているOriginチェックのために必要となっています。ここの<b>ドメイン名は開発者登録後に変更可能</b>ですので、まずは「localhost」とだけ入力しておいてください。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/07/ss03.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/07/ss03.png" alt="ss03" width="640" height="445" class="alignnone size-full wp-image-16357" srcset="/wp-content/uploads/2015/07/ss03.png 640w, /wp-content/uploads/2015/07/ss03-300x209.png 300w, /wp-content/uploads/2015/07/ss03-207x144.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>登録が正常に完了したら、ログインページへ行き、ログインしてください。ログインが完了すると以下の画面のような開発者ダッシュボードが表示されます。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/07/ss04.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/07/ss04-640x445.png" alt="ss04" width="640" height="445" class="alignnone size-large wp-image-16358" srcset="/wp-content/uploads/2015/07/ss04.png 640w, /wp-content/uploads/2015/07/ss04-300x209.png 300w, /wp-content/uploads/2015/07/ss04-207x144.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>右に表示されいるのがAPIキーです（上図ではマスクしています）。こちらをJavaScriptやiOS/Androidのコード内に埋め込み、SkyWayのAPIにアクセスします。</p>

<p>ちなみに、設定変更ボタンをクリックすると、利用ドメインの編集やRestAPIの有効無効の切り替え、そしてAPIキーの削除が可能です。</p>

<p>これでSkyWayを利用するための準備が整いました。早速ビデオチャットを実装してみましょう。</p>

<h2>簡易ビデオチャットの作成と実行</h2>

<p>まず、ビデオチャットを実装するにあたり、以下の環境をご用意ください。</p>

<ul>
<li>Chorme, Firefox, Operaのいずれかのブラウザ</li>
<li>カメラ／マイク （PCに接続可能なもの）</li>
</ul>

<p>まずは以下の内容で、HTMLを書きます。適当なフォルダに「videochat.html」というファイル名でHTMLファイルを作成してください。</p>

<p></p><pre class="crayon-plain-tag"><html>
<head>
    <script type="text/javascript" src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
    <script type="text/javascript" src="https://skyway.io/dist/v2/0.3/peer.js"></script>
    <script type="text/javascript" src="videochat.js"></script>
</head>
<body>
    <h1>Simple Video Chat</h1>
    <div>
        <video id="my-video" style="width: 300px;" autoplay></video>
        <video id="peer-video" style="width: 300px;" autoplay></video>
    </div>
    <div>
        <p>MyID: <span id="my-id">-</span></p>
        <p>PeerID: <span id="peer-id">-</span></p>
    </div>
    <div>
        <input type="text" placeholder="PeerID" id="peer-id-input">
        <button id="call-start">Start Call</button>
        <button id="call-end">End Call</button>
    </div>
</body>
</html></pre><p></p>

<p>HEADタグ内で、jQueryとSkyWayライブラリ、そして今回作成するビデオチャット用のJavaScriptを読み込んでいます。jQueryはボタンクリック時のイベントを設定するときに使用します。SkyWayライブラリは今まで説明してきたとおり、シグナリング部分の処理を全部行ってくれるライブラリです。</p>

<p>次にJavaScriptのコードを書きます。先ほどのHTMLと同じフォルダに、「videochat.js」というファイル名でJavaScriptのファイルを作成してください。ここで、APIキーは先ほど入手したものに置き変えて入力してください。</p>

<p></p><pre class="crayon-plain-tag">// カメラ／マイクにアクセスするためのメソッドを取得しておく
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;

var localStream;    // 自分の映像ストリームを保存しておく変数
var connectedCall;  // 接続したコールを保存しておく変数

// SkyWayのシグナリングサーバーへ接続する (APIキーを置き換える必要あり）
var peer = new Peer({ key: 'YourApiKey', debug: 3});

// シグナリングサーバへの接続が確立したときに、このopenイベントが呼ばれる
peer.on('open', function(){
    // 自分のIDを表示する
    // - 自分のIDはpeerオブジェクトのidプロパティに存在する
    // - 相手はこのIDを指定することで、通話を開始することができる
    $('#my-id').text(peer.id);
});

// 相手からビデオ通話がかかってきた場合、このcallイベントが呼ばれる
// - 渡されるcallオブジェクトを操作することで、ビデオ映像を送受信できる
peer.on('call', function(call){
  　
    // 切断時に利用するため、コールオブジェクトを保存しておく
    connectedCall = call;

    // 相手のIDを表示する
    // - 相手のIDはCallオブジェクトのpeerプロパティに存在する
    $("#peer-id").text(call.peer);

    // 自分の映像ストリームを相手に渡す
    // - getUserMediaで取得したストリームオブジェクトを指定する
    call.answer(localStream);

    // 相手のストリームが渡された場合、このstreamイベントが呼ばれる
    // - 渡されるstreamオブジェクトは相手の映像についてのストリームオブジェクト
    call.on('stream', function(stream){

        // 映像ストリームオブジェクトをURLに変換する
        // - video要素に表示できる形にするため変換している
        var url = URL.createObjectURL(stream);

        // video要素のsrcに設定することで、映像を表示する
        $('#peer-video').prop('src', url);
    });
});

// DOM要素の構築が終わった場合に呼ばれるイベント
// - DOM要素に結びつく設定はこの中で行なう
$(function() {

    // カメラ／マイクのストリームを取得する
    // - 取得が完了したら、第二引数のFunctionが呼ばれる。呼び出し時の引数は自身の映像ストリーム
    // - 取得に失敗した場合、第三引数のFunctionが呼ばれる
    navigator.getUserMedia({audio: true, video: true}, function(stream){

        // このストリームを通話がかかってき場合と、通話をかける場合に利用するため、保存しておく
        localStream = stream;

        // 映像ストリームオブジェクトをURLに変換する
        // - video要素に表示できる形にするため変換している
        var url = URL.createObjectURL(stream);

        // video要素のsrcに設定することで、映像を表示する
        $('#my-video').prop('src', url);

    }, function() { alert("Error!"); });

    // Start Callボタンクリック時の動作
    $('#call-start').click(function(){

        // 接続先のIDをフォームから取得する
        var peer_id = $('#peer-id-input').val();

        // 相手と通話を開始して、自分のストリームを渡す
        var call = peer.call(peer_id, localStream);
            
        // 相手のストリームが渡された場合、このstreamイベントが呼ばれる
        // - 渡されるstreamオブジェクトは相手の映像についてのストリームオブジェクト
        call.on('stream', function(stream){
            // 相手のIDを表示する
            $("#peer-id").text(call.peer);

            // 映像ストリームオブジェクトをURLに変換する
            // - video要素に表示できる形にするため変換している
            var url = URL.createObjectURL(stream);

            // video要素のsrcに設定することで、映像を表示する
            $('#peer-video').prop('src', url);
        });
    });

    // End　Callボタンクリック時の動作
    $('#call-end').click(function(){
        // ビデオ通話を終了する
        connectedCall.close();
    });
});</pre><p></p>

<p>これらはローカルのファイルとして開いても動作しません。ローカルPC上にサーバを立ててファイルをホスティングしてあげる必要があります。このためだけにローカルPCにApacheやNginxを入れるのもの大変なので、今回はPHP付属のビルトインサーバを利用します。
ターミナルを開いて次のコマンドを入力してください (要PHP5.4.0以上)</p>

<p></p><pre class="crayon-plain-tag">$ cd {HTML/Javascriptのあるフォルダ}
$ php -S localhost:8888</pre><p></p>

<p>これで準備が全て整いました。早速ブラウザで開いてみましょう。WebRTCは現在のところChrome, Firefox, Operaでしか動作しないため、それらのブラウザを利用する必要があります。また現在も開発が続けられている分野ですので、最新バージョンを利用するのが望ましいです。</p>

<p>今回は、ビデオ通話を開始する側と受ける側の両方を自分で試してみます。ですので、以下のURLを2つのウィンドウ（またはタブ）で開いてみてください。</p>

<p><a href="http://localhost:8888/videochat.html" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">http://localhost:8888/videochat.html</a></p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/07/ss05.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/07/ss05.png" alt="ss05" width="640" height="445" class="alignnone size-full wp-image-16359" srcset="/wp-content/uploads/2015/07/ss05.png 640w, /wp-content/uploads/2015/07/ss05-300x209.png 300w, /wp-content/uploads/2015/07/ss05-207x144.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>無事に表示されたでしょうか？</p>

<p>アクセス時に、カメラとマイクへのアクセスについて許可を求められるので、許可しておきましょう。許可すると、カメラ映像が画面左に表示されます。</p>

<p>それでは、早速通話を開始してみたいと思います。まず、接続相手のIDを渡す必要があります。ビデオ通話を受ける側のIDをコピーして、かける側のテキストボックスに貼り付けてください。相手のIDをちゃんと貼り付けることができたなら、隣の「Start Call」を押します。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/07/ss06.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/07/ss06.png" alt="ss06" width="640" height="445" class="alignnone size-full wp-image-16360" srcset="/wp-content/uploads/2015/07/ss06.png 640w, /wp-content/uploads/2015/07/ss06-300x209.png 300w, /wp-content/uploads/2015/07/ss06-207x144.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>2つの映像が表示されれば成功です。</p>

<p>以上が簡単なビデオチャットのチュートリアルでした。非同期処理が中心でかつ、通話を開始する側と受ける側の両方の処理を書く必要があるため、慣れるまでコードの理解が難しいですが、ここさえ乗り越えればスムーズにコードを書くことができますので、少しづつ理解してみてください。</p>

<h2>データ通信を使った文字ベースチャット</h2>

<p>続いてWebRTCを用いたデータ通信を使ったチャットアプリを作ってみたいと思います。既にビデオチャットを理解できていれば、全く難しいことはありません。</p>

<p>先ほどと同様に、以下の内容で、HTMLを書きます。適当なフォルダに「datachat.html」というファイル名でHTMLファイルを作成してください。</p>

<p></p><pre class="crayon-plain-tag"><html>
<head>
    <script type="text/javascript" src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
    <script type="text/javascript" src="https://skyway.io/dist/v2/0.3/peer.js"></script>
    <script type="text/javascript" src="datachat.js"></script>
</head>
<body>
    <h1>Chat</h1>
    <div>
        <input type="text" placeholder="PeerID" id="peer-id-input">
        <button id="connect">Connect</button>
        <button id="close">Close</button>
    </div>
    <div>
        <p>MyID: <span id="my-id">-</span></p>
        <p>PeerID: <span id="peer-id">-</span></p>
    </div>
    <hr>
    <div>
        <input type="text" placeholder="Chat Message" id="message">
        <button id="send">Send</button>
    </div>
    <div id="messages"></div>
</body>
</html></pre><p></p>

<p>次はJavaScriptです。先ほどのHTMLと同じフォルダに「datachat.js」というファイル名でJavaScriptのファイルを作成してください。
APIキーについてもビデオ通話と同様に、先ほど入手したものに置き変えてください。</p>

<p></p><pre class="crayon-plain-tag">var conn;     // データ通信用connectionオブジェクトの保存用変数 

// SkyWayのシグナリングサーバーへ接続する  (APIキーを置き換える必要あり）
var peer = new Peer({ key: 'YourApiKey', debug: 3});

// シグナリングサーバへの接続が確立したときに、このopenイベントが呼ばれる
peer.on('open', function(){
    // 自分のIDを表示する
    // - 自分のIDはpeerオブジェクトのidプロパティに存在する
    // - 相手はこのIDを指定することで、通信を開始することが出来る
    $('#my-id').text(peer.id);
});
 
// 相手からデータ通信の接続要求イベントが来た場合、このconnectionイベントが呼ばれる
// - 渡されるconnectionオブジェクトを操作することで、データ通信が可能
peer.on('connection', function(connection){
  　
    // データ通信用に connectionオブジェクトを保存しておく
    conn = connection;

    // 接続が完了した場合のイベントの設定
    conn.on("open", function() {
        // 相手のIDを表示する
        // - 相手のIDはconnectionオブジェクトのidプロパティに存在する
        $("#peer-id").text(conn.id);
    });

    // メッセージ受信イベントの設定
    conn.on("data", onRecvMessage);
});

// メッセージ受信イベントの設定
function onRecvMessage(data) {
    // 画面に受信したメッセージを表示
    $("#messages").append($("<p>").text(conn.id + ": " + data).css("font-weight", "bold"));
}

// DOM要素の構築が終わった場合に呼ばれるイベント
// - DOM要素に結びつく設定はこの中で行なう
$(function() {

    // Connectボタンクリック時の動作
    $("#connect").click(function() {
        // 接続先のIDをフォームから取得する
        var peer_id = $('#peer-id-input').val();

        // 相手への接続を開始する
        conn = peer.connect(peer_id);

        // 接続が完了した場合のイベントの設定
        conn.on("open", function() {
            // 相手のIDを表示する
            // - 相手のIDはconnectionオブジェクトのidプロパティに存在する
            $("#peer-id").text(conn.id);
        });

        // メッセージ受信イベントの設定
        conn.on("data", onRecvMessage);
    });

    // Sendボタンクリック時の動作
    $("#send").click(function() {
        // 送信テキストの取得
        var message = $("#message").val();

        // 送信
        conn.send(message);

        // 自分の画面に表示
        $("#messages").append($("<p>").html(peer.id + ": " + message));

        // 送信テキストボックスをクリア
        $("#message").val("");
    });

    // Closeボタンクリック時の動作
    $("#close").click(function() {
        conn.close();
    });
});</pre><p></p>

<p>では、ローカルにHTTPサーバを立てて開いてみましょう。</p>

<p></p><pre class="crayon-plain-tag">$ cd {HTML/Javascriptのあるフォルダ}
$ php -S localhost:8888</pre><p></p>

<p><a href="http://localhost:8888/datachat.html" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">http://localhost:8888/datachat.html</a></p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/07/ss07.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/07/ss07.png" alt="ss07" width="640" height="445" class="alignnone size-full wp-image-16361" srcset="/wp-content/uploads/2015/07/ss07.png 640w, /wp-content/uploads/2015/07/ss07-300x209.png 300w, /wp-content/uploads/2015/07/ss07-207x144.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>先程と同様に、接続を開始する側と接続を受ける側の両方が必要なため、2つ開いてください。無事に表示されましたでしょうか？</p>

<p>それでは、データ通信を開始してみたいと思います。接続相手のIDをコピーして、接続を開始する側のテキストボックスに貼り付けて、Connectボタンを押してください。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/07/ss08.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/07/ss08.png" alt="ss08" width="640" height="445" class="alignnone size-full wp-image-16362" srcset="/wp-content/uploads/2015/07/ss08.png 640w, /wp-content/uploads/2015/07/ss08-300x209.png 300w, /wp-content/uploads/2015/07/ss08-207x144.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>相手のIDがお互いの画面に表示されれば接続できています。では、チャット欄に文字を入力してSendボタンを押してみましょう。
相手の画面と自分の画面、両方に表示されれば成功です。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/07/ss09.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/07/ss09.png" alt="ss09" width="640" height="445" class="alignnone size-full wp-image-16363" srcset="/wp-content/uploads/2015/07/ss09.png 640w, /wp-content/uploads/2015/07/ss09-300x209.png 300w, /wp-content/uploads/2015/07/ss09-207x144.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>以上が簡単なテキストチャットのチュートリアルでした。WebRTCを使えば、テキストだけじゃなく、JavaScriptのオブジェクトやファイル等も送ることが可能です。</p>

<h2>おわりに</h2>

<p>今回はSkyWayを使った、簡単なビデオチャット／文字ベースチャットのチュートリアルをお届けしました。WebRTCは便利で高機能な反面、自分で実装しようとすると大変ですが、SkyWayを使うことで手軽に利用可能です。</p>

<p>次回はSkyWayを使って、Android/iPhoneでWebRTCを簡単に使う方法をお伝えしたいと思います。</p>
]]></content:encoded>
		
		<series:name><![CDATA[WebRTCプラットフォーム ”SkyWay” 入門]]></series:name>
	</item>
		<item>
		<title>斉藤祐也の海外WEBテク定点観測＜Issue.5: 2013/08/31-2013/09/13＞</title>
		<link>/cssradar/2463/</link>
		<pubDate>Mon, 16 Sep 2013 22:00:17 +0000</pubDate>
		<dc:creator><![CDATA[斉藤 祐也]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[デザイン]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[W3C仕様]]></category>
		<category><![CDATA[WebGL]]></category>
		<category><![CDATA[海外]]></category>

		<guid isPermaLink="false">/?p=2463</guid>
		<description><![CDATA[プログレッシブ・エンハンスメントに対する熱い議論、Steve Losh氏による技術文書の正しい書き方、JavaScript本の名著であるEloquent JavaScript2版のクラウドファンディングなど、14日間（8...]]></description>
				<content:encoded><![CDATA[<p>プログレッシブ・エンハンスメントに対する熱い議論、Steve Losh氏による技術文書の正しい書き方、JavaScript本の名著であるEloquent JavaScript2版のクラウドファンディングなど、14日間（8/31～9/13）のWeb開発最新ニュース合計18件を紹介します！</p>

<p><span id="more-2463"></span></p>

<h2>注目ニュースピックアップ</h2>

<h3>プログレッシブ・エンハンスメントはもう過去の話なのか?</h3>

<p><img src="/wp-content/uploads/2013/09/89f510799f3c4e4ab09ee882e8d3c595.png" alt="progressive-enhancement:-zed’s-dead,-baby-:-tom-dale-1024x768" width="300" height="255" class="aligncenter size-full wp-image-2490" srcset="/wp-content/uploads/2013/09/89f510799f3c4e4ab09ee882e8d3c595.png 300w, /wp-content/uploads/2013/09/89f510799f3c4e4ab09ee882e8d3c595-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>この14日間はプログレッシブ・エンハンスメントについて多くの議論が行われた。</p>

<p>事の発端はDaniel Mall氏が始めた<a href="http://sighjavascript.tumblr.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Sigh, JavaScript</a>という様々なWebサイトで、JavaScriptをオフにした際の状態をキャプチャしてリストするというTumblr。<br />
それに対して、Ember.jsのメンテナーであるTom Dale氏が<a href="http://tomdale.net/2013/09/progressive-enhancement-is-dead/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Progressive Enhancement: Zed’s Dead, Baby</a>と題した記事で「プログレッシブ・エンハンスメントはもう終わったアプローチである」と宣言した。<br />
そのTom Dale氏の記事に、Jake Archibald氏が<a href="http://jakearchibald.com/2013/progressive-enhancement-is-faster/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Progressive enhancement is faster</a>にて反論。
そして、Daniel Mall氏も<a href="http://danielmall.com/articles/progressive-enhancement/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">“Progressive Enhancement. Still Alive &amp; Kickin’.</a>でSign, JavaScriptを始めた理由を説明した。
これらの反論に対して、Tom Dale氏は<a href="http://tomdale.net/2013/09/maybe-progressive-enhancement-is-the-wrong-term/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Maybe Progressive Enhancement is the Wrong Term</a>にてプログレッシブ・エンハンスメントという言葉の意味は範囲を再確認している。
技術者的な視点だけではなく、デザイナからの視点でもこのトピックに対して様々な記事があがったりと、プログレッシブ・エンハンスメントそのものに対する興味関心の高さが分かるすばらしい議論となった。</p>

<h3><a href="http://stevelosh.com/blog/2013/09/teach-dont-tell/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">効果的なドキュメンテーションの作り方について &#8211; Steve Losh</a></h3>

<p><img src="/wp-content/uploads/2013/09/steve-losh-1024x768.png" alt="-steve-losh-1024x768" width="300" height="255" class="aligncenter size-full wp-image-2477" srcset="/wp-content/uploads/2013/09/steve-losh-1024x768.png 300w, /wp-content/uploads/2013/09/steve-losh-1024x768-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: Teach, Don&#8217;t Tell</p>

<p>Steve Losh氏によるテクニカル文書、主にプログラミング言語やライブラリなどのドキュメンテーションの書き方について、7つのアンチパターンを通して、よりよいドキュメントを書くために覚えておきたいことをまとめている。<br />
自分でオープンソースとしてライブラリなどを公開している方はもちろん、会社やチームのガイドラインを作成している人にも、勉強会などでプレゼンをする人にもおすすめできるすばらしいアドバイス。</p>

<h3><a href="https://eloquentjavascript.net/2nd_edition/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Eloquent JavaScript 第二版 &#8211; Marijn Haverbeke</a></h3>

<p><img src="/wp-content/uploads/2013/09/eloquent-javascript-second-edition-1024x768.png" alt="eloquent-javascript-second-edition-1024x768" width="300" height="255" class="aligncenter size-full wp-image-2483" srcset="/wp-content/uploads/2013/09/eloquent-javascript-second-edition-1024x768.png 300w, /wp-content/uploads/2013/09/eloquent-javascript-second-edition-1024x768-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: Eloquent JavaScript second edition</p>

<p>JavaScriptを学ぶ上で読んでおくべき書籍は?という質問には確実に名を連ねてくるのがMarijn Haverbeke氏による「Eloquent JavaScript」。解説だけではなく、実際に手を動かすエクササイズがあったりと、当時としては画期的な書籍で、さらにクリエイティブ・コモンライセンスでオンライン版は無料で公開されている。<br />
2007年に執筆されたこの本は、現在第二版に向けて執筆を始めている。筆者はその執筆のためにクラウド・ファンディングをしているので、興味がある方はぜひファンドに協力してみてはいかがだろう。</p>

<h3><a href="http://www.miscmagazine.com/great-design-always-means-great-style/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">すばらしいデザインは常にすばらしいスタイルである &#8211; MISC Magazine</a></h3>

<p><img src="/wp-content/uploads/2013/09/misc-magazine-great-design-always-means-great-style-1024x768.png" alt="misc-magazine-|-great-design-always-means-great-style-1024x768" width="300" height="255" class="aligncenter size-full wp-image-2488" srcset="/wp-content/uploads/2013/09/misc-magazine-great-design-always-means-great-style-1024x768.png 300w, /wp-content/uploads/2013/09/misc-magazine-great-design-always-means-great-style-1024x768-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: Great Design Always Means Great Style</p>

<p>Don Norman氏によるよいデザイン、よいスタイルについてのこの記事では、そもそもデザインにおけるスタイルとは単純な見た目のファッションではなく、パーソナリティのようなものではないかと説明。パーソナリティとは車でいうところのポルシェやBMV、メルセデス・ベンツのようなブランドに抱くイメージを分かりやすい例として紹介している。<br />
氏は記事を以下のように締めくくっている。
『すばらしいデザインとは常にすばらしいスタイルを意味する。正直で、理路整然としていて、一貫性があるものだ。』</p>

<h3><a href="https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/ResourcePriorities/Overview.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">リソース・プライオリティ &#8211; W3C</a></h3>

<p><img src="/wp-content/uploads/2013/09/resource-priorities-1024x768.png" alt="resource-priorities-1024x768" width="300" height="255" class="aligncenter size-full wp-image-2491" srcset="/wp-content/uploads/2013/09/resource-priorities-1024x768.png 300w, /wp-content/uploads/2013/09/resource-priorities-1024x768-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: Resource Priorities</p>

<p>パフォーマンスは今ではインフラ担当の人間だけの問題ではなく、もちろんフロントエンド開発者だけの問題でもなく、全員の問題だ。<br />
その全員にはもちろんW3Cも含まれる。<br />
Resource Prioritiesという仕様はまだドラフト段階ではあるが、画像やスクリプト、ビデオやオーディオに対して、lazyloadやpostponeという属性を追加できるようにするものだ。<br />
これらの属性はJavaScriptを使ってすでに解決されつつある問題ではあるが、仕様として存在する意義は大きい。</p>

<h2>海外トレンドコラム</h2>

<h3><a href="http://www.nczonline.net/blog/2013/09/10/understanding-ecmascript-6-arrow-functions/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ECMAScript 6のArrowファンクションについて &#8211; NCZOnline</a></h3>

<p><img src="/wp-content/uploads/2013/09/understanding-ecmascript-6-arrow-functions-nczonline-1024x768.png" alt="understanding-ecmascript-6-arrow-functions-|-nczonline-1024x768" width="300" height="255" class="aligncenter size-full wp-image-2494" srcset="/wp-content/uploads/2013/09/understanding-ecmascript-6-arrow-functions-nczonline-1024x768.png 300w, /wp-content/uploads/2013/09/understanding-ecmascript-6-arrow-functions-nczonline-1024x768-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: Understanding ECMAScript 6 arrow functions</p>

<p>ECMAScript 6で追加される予定のArrowファンクションについてNicolas Zakas氏による解説。<br />
Arrowファンクションはその名前の通り、関数のシンタックスを =&gt; このような矢印を使って置き換えることができるようになる。<br />
ただそれだけではなく、newができない、thisのバインディングが違うなどの点が異なる。</p>

<h3><a href="http://blogs.telerik.com/james-bender/posts/13-09-09/30-days-tdd-day-one-what-is-tdd" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">テスト駆動開発とはなにか、そしてどんなものなのか</a></h3>

<p><img src="/wp-content/uploads/2013/09/f2f340cc27327f56a607b57a4f283e07.png" alt="30-days-of-tdd:-day-one-–-what-is-tdd-and-why-should-i-use-it?-1024x768" width="300" height="255" class="aligncenter size-full wp-image-2478" srcset="/wp-content/uploads/2013/09/f2f340cc27327f56a607b57a4f283e07.png 300w, /wp-content/uploads/2013/09/f2f340cc27327f56a607b57a4f283e07-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: 30 Days of TDD: Day One – What is TDD and Why Should I Use It?</p>

<p>テスト駆動開発にについて、30日間連続で書き続けるチャレンジの1日目。第一回目は、そもそもテスト駆動開発とはどんなものか、そして、その開発ワークフローをどうして利用するべきなのかを解説。</p>

<h3><a href="http://www.stevesouders.com/blog/2013/09/05/domain-sharding-revisited/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ドメイン・シャーディングをもう一度振り返ってみよう &#8211; High Performance Web Sites</a></h3>

<p><img src="/wp-content/uploads/2013/09/domain-sharding-revisited-high-performance-web-sites-1024x768.png" alt="domain-sharding-revisited-|-high-performance-web-sites-1024x768" width="300" height="255" class="aligncenter size-full wp-image-2482" srcset="/wp-content/uploads/2013/09/domain-sharding-revisited-high-performance-web-sites-1024x768.png 300w, /wp-content/uploads/2013/09/domain-sharding-revisited-high-performance-web-sites-1024x768-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: Domain Sharding revisited</p>

<p>パフォーマンスにおいて、SPDYやHTTP 2.0の時代が来るとアンチパターンになると言われている。だが、ドメイン・シャーディングというテクニックについて、スティーブ・サウダー氏は、そうとも言えないのではないかと話し、大抵のウェブサイトにおいては次の時代でも活用できるとしている。</p>

<h3><a href="http://www.shanehudson.net/2013/09/10/responsive-images-meeting-notes/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">レスポンシブ・イメージ会議メモ &#8211; Shane Hudson Dot Net</a></h3>

<p><img src="/wp-content/uploads/2013/09/responsive-images-meeting-notes-shane-hudson-dot-net-1024x768.png" alt="responsive-images-meeting-notes---shane-hudson-dot-net-1024x768" width="300" height="255" class="aligncenter size-full wp-image-2492" srcset="/wp-content/uploads/2013/09/responsive-images-meeting-notes-shane-hudson-dot-net-1024x768.png 300w, /wp-content/uploads/2013/09/responsive-images-meeting-notes-shane-hudson-dot-net-1024x768-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: Responsive Images Meeting Notes</p>

<p>9/10にパリで開かれたレスポンシブ・イメージに関する会議のメモ。若干散文的ではあるが、会議で話された内容について大事なポイントをおさえているので、非常に参考になる。先日、webkitにてsrcsetが実装されたが、レスポンシブな環境における画像の取り扱いについて、まだまだ課題は多い。今後も目が話せないトピックだ。</p>

<h3><a href="https://github.com/andreineculau/know-your-http-well" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">いまさら聞けないHTTP</a></h3>

<p><img src="/wp-content/uploads/2013/09/5ebe6ed3cbd7ffd9f21c8192915d65ae.png" alt="know-your-http-well-·-github-1024x768" width="300" height="255" class="aligncenter size-full wp-image-2487" srcset="/wp-content/uploads/2013/09/5ebe6ed3cbd7ffd9f21c8192915d65ae.png 300w, /wp-content/uploads/2013/09/5ebe6ed3cbd7ffd9f21c8192915d65ae-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: Know Your HTTP Well</p>

<p>もう本当にいまさら聞けないHTTPにまつわる話を、仕様やヘッダ、メディアタイプ(今後追加される様子)、メソッド、ステータスコードなどのように区分し、それぞれ詳しく解説している。あっという間に1000スターという人気のほどなので、いまさら聞けないのは私だけではなかったようです。</p>

<h3><a href="http://dev.opera.com/articles/view/mutation-observers-tutorial/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Mutation Observersの使い方 &#8211; Dev.Opera</a></h3>

<p><img src="/wp-content/uploads/2013/09/getting-to-know-mutation-observers-dev.opera-1024x768.png" alt="getting-to-know-mutation-observers---dev.opera-1024x768" width="300" height="255" class="aligncenter size-full wp-image-2485" srcset="/wp-content/uploads/2013/09/getting-to-know-mutation-observers-dev.opera-1024x768.png 300w, /wp-content/uploads/2013/09/getting-to-know-mutation-observers-dev.opera-1024x768-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: Getting to know mutation observers</p>

<p>JavaScriptが多く利用されるプロダクトの制作を行っているとあるDOMノードツリーが変わったタイミングを知りたいということはよくある。<br />
この記事で紹介をしているDOMレベル4仕様で定義されたMutation Observersは、これまで抱えてきた問題を解決してくれる。これまで利用してきたMutationEventとの違いを踏まえて、利用方法を解説。</p>

<h3><a href="http://gaslight.co/blog/does-coffeescript-have-a-future" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CoffeeScriptに未来はあるのか?</a></h3>

<p><img src="/wp-content/uploads/2013/09/does-coffeescript-have-a-future-1024x768.png" alt="does-coffeescript-have-a-future?-1024x768" width="300" height="255" class="aligncenter size-full wp-image-2481" srcset="/wp-content/uploads/2013/09/does-coffeescript-have-a-future-1024x768.png 300w, /wp-content/uploads/2013/09/does-coffeescript-have-a-future-1024x768-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: Does CoffeeScript Have a Future?</p>

<p>CoffeeScriptはどんな役割を持った言語なのか、JavaScriptに変換される言語としてはよく使われる言語ではあるが、もしかするとJavaScriptそのものの変化にしたがって、もう必要がなくなるかも知れない。CoffeeScriptを愛してやまない著者のゆらぎを感じる非常にすばらしい記事。</p>

<h2>クローズアップ“ビデオ/スライド”</h2>

<h3><a href="http://www.youtube.com/watch?v=GNO_CYUjMK8" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">WebGLの基礎と応用 &#8211; Steven Wittens</a></h3>

<p><img src="/wp-content/uploads/2013/09/StevenWittensMakingWebGLDance.png" alt="StevenWittensMakingWebGLDance" width="300" height="255" class="aligncenter size-full wp-image-2493" srcset="/wp-content/uploads/2013/09/StevenWittensMakingWebGLDance.png 300w, /wp-content/uploads/2013/09/StevenWittensMakingWebGLDance-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: Making WebGL Dance</p>

<p><a href="https://html5experts.jp/cssradar/1995/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">前回の本連載</a>にてピックアップしたActo.netのSteve Wittens氏による、WebGLのイントロダクションビデオ。非常にベーシックな三角形から描画し、アンチエイリアスなどから始め、徐々に3Dの世界へ導いていく。数学的なアプローチは難しい部分も多いが、最終的なアウトプットを見ると、チャレンジする価値があると思わせるプレゼンテーション。</p>

<h3><a href="http://www.youtube.com/watch?v=x0VR3lUOpdc" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ジャンク・バスターズ: Google Chromeにおけるレンダリングパフォーマンスについて &#8211; Nat Duca &amp; Tom Wiltzius</a></h3>

<p><img src="/wp-content/uploads/2013/09/NatDucaTomWiltziusJankBusters.png" alt="NatDucaTomWiltziusJankBusters" width="300" height="255" class="aligncenter size-full wp-image-2489" srcset="/wp-content/uploads/2013/09/NatDucaTomWiltziusJankBusters.png 300w, /wp-content/uploads/2013/09/NatDucaTomWiltziusJankBusters-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: Jank Busters &#8211; Chrome Rendering Performance</p>

<p>GoogleのNat Duca氏とTom Wiltzius氏によるJank Bustersシリーズのアップデート版。これまで両氏は何回か同じトピックでプレゼンテーションを行ってきているが、最新版にアップデートされたもの。アニメーションだけではなく、レンダリングプロセスを最適化するために知っておいたほうがよいことばかりをコンパクトに解説している。</p>

<h2>一歩先行く“コード”</h2>

<h3><a href="http://labs.bigroomstudios.com/libraries/animo-js" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">animo.js</a></h3>

<p><img src="/wp-content/uploads/2013/09/f247bd4f56e723017880fed026c25810.png" alt="animo.js-•-labs-by-big-room-studios-1024x768" width="300" height="255" class="aligncenter size-full wp-image-2479" srcset="/wp-content/uploads/2013/09/f247bd4f56e723017880fed026c25810.png 300w, /wp-content/uploads/2013/09/f247bd4f56e723017880fed026c25810-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>jQuery依存が気にならない、ことはないが、Dan Eden氏作の<a href="http://daneden.me/animate/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">animation.css</a>をベースに、連続したアニメーションを行うのに非常にシンプルなシンタックスで可能にしている。</p>

<h3><a href="http://snorpey.github.io/jpg-glitch/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">JavaScriptでJPEG画像を壊してみよう</a></h3>

<p>原題: Image Glitch Experiment</p>

<p>正直なところ何の役に立つのかはわからないが、JavaScriptを使ってJPEG画像を破壊するツール。こういった実験的な実装は見ていて楽しいが、作るとより楽しいはず。</p>

<h3><a href="https://github.com/paulirish/frontend-feeds" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Paul Irishおすすめ。フロントエンド開発者のためのフィード</a></h3>

<p><img src="/wp-content/uploads/2013/09/00055ade3b88b9e6d4ef1879125cc369.png" alt="frontend-feeds-·-github-1024x768" width="300" height="255" class="aligncenter size-full wp-image-2484" srcset="/wp-content/uploads/2013/09/00055ade3b88b9e6d4ef1879125cc369.png 300w, /wp-content/uploads/2013/09/00055ade3b88b9e6d4ef1879125cc369-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: Frontend Feeds</p>

<p>私自身にとって、貴重な情報源であるGoogleのPaul Irish氏がまとめたフロントエンドデベロッパのためのフィード。<br />
以前にも彼はこの形式でフィードを共有していたが、今回はGitHub。Paulチョイスだけあって、非常にクオリティが高いのでおすすめ。</p>

<h2>海外で話題の“ツール”</h2>

<h3><a href="http://customelements.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Custom Element: モダンなWebアプリのためのWeb Componentsギャラリー</a></h3>

<p><img src="/wp-content/uploads/2013/09/custom-elements-a-web-components-gallery-for-modern-web-apps-1024x768.png" alt="custom-elements---a-web-components-gallery-for-modern-web-apps-1024x768" width="300" height="255" class="aligncenter size-full wp-image-2480" srcset="/wp-content/uploads/2013/09/custom-elements-a-web-components-gallery-for-modern-web-apps-1024x768.png 300w, /wp-content/uploads/2013/09/custom-elements-a-web-components-gallery-for-modern-web-apps-1024x768-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: Custom Elements &#8211; A Web Components Gallery for Modern Web Apps</p>

<p>まだまだ登録数は少ないが、Web ComponentsをGitHubのリポジトリから登録でき、検索可能にするギャラリーサイト。<br />
今後はコンポーネント数が増え、欠かすことができないツールになりえるかもしれない。</p>

<p>★次回の「斉藤祐也の海外WEBテク定点観測」は、9月30日にお届け予定です。★</p>
]]></content:encoded>
			</item>
		<item>
		<title>モダンな言語でHTML5を開発しよう！ 俯瞰して理解するaltJSの比較 (前篇 &#8211; TypeScript, CoffeeScript, Haxe)</title>
		<link>/clockmaker/2183/</link>
		<pubDate>Mon, 09 Sep 2013 22:00:06 +0000</pubDate>
		<dc:creator><![CDATA[池田 泰延]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[CoffeeScript]]></category>
		<category><![CDATA[Dart]]></category>
		<category><![CDATA[Haxe]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[TypeScript]]></category>
		<category><![CDATA[altJS]]></category>

		<guid isPermaLink="false">/?p=2183</guid>
		<description><![CDATA[ここ数年のHTML5やCSS3の劇的な進化に比べて、JavaScriptの言語としての進化は緩やかだったのではないでしょうか。HTML5の登場により、リッチなウェブサイト・コンテンツ・アプリケーションが求められる時代にな...]]></description>
				<content:encoded><![CDATA[<p>ここ数年のHTML5やCSS3の劇的な進化に比べて、JavaScriptの言語としての進化は緩やかだったのではないでしょうか。HTML5の登場により、リッチなウェブサイト・コンテンツ・アプリケーションが求められる時代になったのに、それを制御する言語が未だにレガシーなものであり、ニーズに追いついていないのが現状です。</p>

<p>2010年前後からこれらを解決する手段として、JavaScriptを生成する中間言語が登場してきました。これらは<strong>JavaScriptの代替ということで「altJS」</strong>と呼ばれています。altJSの言語の多くはクラス機構のサポートなどJavaScriptの抱える問題の多くを解決しており、スマートにコードを書くための仕組みが用意されており、<strong>開発効率を大幅に向上させることができます</strong>。本記事では前後編の2回でaltJSの5種類の言語を比較します。</p>

<p><img src="/wp-content/uploads/2013/09/altjs_image.png" alt="altjs_image" width="640" height="299" class="alignnone size-full wp-image-2239" srcset="/wp-content/uploads/2013/09/altjs_image.png 640w, /wp-content/uploads/2013/09/altjs_image-300x140.png 300w, /wp-content/uploads/2013/09/altjs_image-207x96.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><span id="more-2183"></span></p>

<h2>はじめに</h2>

<p>altJSとしてよく知られているのが次の5つの言語です。これらの複数の選択肢から、どの言語を選択するかは悩みどころです。例えば静的型情報やコンパイル時の型チェックの有無、パフォーマンス、既存JSとの相性、記述を要するコード量、開発環境の充実度など、言語を採用するには<strong>様々な観点からバランスよく選択することが重要</strong>になってきます。</p>

<p>本記事では各言語の基本的な文法や特徴、開発環境、筆者が考えるメリット・デメリットについて紹介します。</p>

<table>
<thead>
<tr>
  <th align="left">言語</th>
  <th>設計/開発</th>
  <th>登場時期</th>
  <th>影響を受けた言語</th>
</tr>
</thead>
<tbody>
<tr>
  <td align="left">CoffeeScript</td>
  <td>Jeremy Ashkenas, et al.</td>
  <td>2009</td>
  <td>JavaScript, Python, Ruby, Haskell</td>
</tr>
<tr>
  <td align="left">TypeScript</td>
  <td>Microsoft</td>
  <td>2012</td>
  <td>JavaScript, Java, C#</td>
</tr>
<tr>
  <td align="left">Haxe</td>
  <td>Haxe Foundation,<br>Nicolas Cannasse</td>
  <td>2005</td>
  <td>ActionScript, OCaml</td>
</tr>
<tr>
  <td align="left">Dart</td>
  <td>Google</td>
  <td>2011</td>
  <td>Java, C++, JavaScript, CoffeeScript, Go</td>
</tr>
<tr>
  <td align="left">JSX</td>
  <td>DeNA</td>
  <td>2012</td>
  <td>JavaScript, ActionScript</td>
</tr>
</tbody>
</table>

<p>※いずれの言語もマルチプラットフォームであり、Windows, Mac OS Xともにどちらでも利用することができます。</p>

<h3>比較対象のサンプル</h3>

<p>サンプルとしてシンプルなスライドショーのWebコンテンツを用意しています。それぞれの言語でどのように記述して実装するのか、また生成されたJavaScriptがどのようなものであるか確認していきましょう。このサンプルでは言語の特性を紹介するために、実用的な要素として「クラス構造の利用」「既存JSライブラリの利用」「ユーザー操作」を含めています。</p>

<ul>
<li><a href="http://clockmaker.jp/project/html5expertsjp/TypeScript/index.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">デモを開く</a></li>
</ul>

<p><a href="http://clockmaker.jp/project/html5expertsjp/TypeScript/index.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2013/09/sample.png" alt="" width="640" height="461" class="alignnone size-full wp-image-2189" srcset="/wp-content/uploads/2013/09/sample.png 640w, /wp-content/uploads/2013/09/sample-300x216.png 300w, /wp-content/uploads/2013/09/sample-207x149.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>「Change Photo」ボタンをクリックすると写真が切り替わります。CSS3の3D TransformsをjQueryを用いて制御します（確認の際には、<a href="http://caniuse.com/#feat=transforms3d" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CSS3の3D Transformsが利用できるブラウザ</a>をご利用下さい）</p>

<h1>TypeScript</h1>

<p><img src="/wp-content/uploads/2013/09/typescript.png" alt="Welcome to TypeScript" /></p>

<h3>概要</h3>

<p><strong><a href="http://www.typescriptlang.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">TypeScript</a>はマイクロソフトが開発するオープンソースの言語</strong>です。TypeScriptはJavaScript/ECMAScript 5を拡張した設計となっており、型情報やクラス、インターフェース、module、アロー関数式、列挙型、ジェネリクスといった言語機能が搭載されています。また既存のJavaScriptに僅かな修正を加えるだけでTypeScriptとして動作させることも可能です。<strong>いつくかの構文はECMAScript 6の案をベースとしたもの</strong>になっています。</p>

<p><strong>出力されたJavaScriptコードはとても読みやすく</strong>、TypeScriptのコードと基本的に1対1対応しています。またコメントも含めてJSに出力されるためデバッグが容易です（ソースマップを利用したデバッグも可能です）。</p>

<h3>既存JSライブラリの使用方法</h3>

<p>TypeScriptでは定義ファイル（拡張子は.d.ts）と呼ばれるインターフェースを定義したファイルを用意します。TypeScriptではreferenceタグという記述で定義ファイルを参照します。有名なJSライブラリの定義ファイルは<a href="https://github.com/borisyankov/DefinitelyTyped" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">borisyankov/DefinitelyTyped</a>でまとまっているので、ここからダウンロードすると良いでしょう。</p>

<pre><code>:javascript:
/// 
</code></pre>

<h3>コード例</h3>

<h4>TypeScriptのコード(v0.9.1.1)</h4>

<p>基本的な文法は既存のJavaScriptと同じです。変数には「:」キーワードで任意に型情報を記述することができ、クラスではアクセス修飾子の「private」を利用することで外部から参照することのできないメンバー変数や関数を用意することができます（カプセル化が可能）。</p>

<pre><code>:javascript:
///     
window.onload = ()=&amp;gt; {
    var countManager:CountManager = new CountManager();

    $("#btn").click(()=&amp;gt; {
        // カウントを更新
        countManager.addCount();
        // CSSの角度を計算
        var rot:number = countManager.getCount() * 90;
        // エレメントに適用
        $("#effect").css("transform", "rotateX(" + rot + "deg)");
    });
}

class CountManager {
    private _count:number = 0;
    constructor() {
    }
    addCount() {
        this._count++;
    }
    getCount() {
        return this._count;
    }
}
</code></pre>

<h4>TypeScriptをコンパイルして生成したJavaScriptのコード</h4>

<p>生成されたJavaScriptがオリジナルのTypeScriptの原型をとどめたまま出力されているのがわかります（日本語を含むコメントアウトまで出力されてます）。</p>

<pre><code>:javascript:

///     
window.onload = function () {
    var countManager = new CountManager();

    $("#btn").click(function () {
        // カウントを更新
        countManager.addCount();

        // CSSの角度を計算
        var rot = countManager.getCount() * 90;

        // エレメントに適用
        $("#effect").css("transform", "rotateX(" + rot + "deg)");
    });
};

var CountManager = (function () {
    function CountManager() {
        this._count = 0;
    }
    CountManager.prototype.addCount = function () {
        this._count++;
    };
    CountManager.prototype.getCount = function () {
        return this._count;
    };
    return CountManager;
})();
//# sourceMappingURL=main.js.map
</code></pre>

<ul>
<li><a href="http://clockmaker.jp/project/html5expertsjp/TypeScript/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">TypeScript版デモを再生する</a></li>
</ul>

<h3>開発環境</h3>

<p>コンパイラを無償でダウンロードできるので、基本的にエディターは選びません。開発環境としてはVisual StudioやWebStorm/IntelliJ IDEAが対応しており、これらのソフトでコード補完やリファクタリング機能を利用することができます。既存のJavaScriptと比べて型指定や型推論も利用できるため、エディターによっては強力なコード補完の恩恵を受けることが可能です。</p>

<p><img src="/wp-content/uploads/2013/09/visualstudio_typescript.png" alt="" /></p>

<p class="wp-caption-text">Visual StudioでTypeScriptを開発している様子</p>

<h3>筆者が考えるTypeScriptのメリットとデメリット</h3>

<p>メリットとしてはJavaScriptを習熟した人であれば、<strong>差分を学習するだけで利用できる学習コストの低さ</strong>や、型情報や数多くの機能が言語に搭載されており、安全かつ効率的に開発できる点です。出力するファイルを分割することも一つにまとめることもでき、<strong>柔軟な開発スタイルが提供されています</strong>。またECMAScript 6の案を先行実装している点からも、将来標準になる言語を学習している安心感があります。</p>

<p>デメリットとしてはコンパイルが遅いことと、クラスのメンバー参照で必ずthisを記述しないといけない点、モジュールを利用した場合の名前空間の記述が煩雑になる点です（import修飾子が使えるものの根本的な解決になってはいない）。こういったメリット・デメリットから、<strong>JavaScriptエンジニアが中・大規模な開発プロジェクトに利用するのに向いている</strong>のではないかと考えています。</p>

<h2>CoffeeScript</h2>

<p><img src="/wp-content/uploads/2013/09/coffeescript.png" alt="CoffeeScript" /></p>

<h3>概要</h3>

<p><a href="http://coffeescript.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CoffeeScript</a>はJavaScriptに比べてシンプルに記述できるため、<strong>コード量が少なくなり可読性の高いコードを記述できる言語</strong>です。クラス機構をサポートしているほか、配列内包やパターンマッチを利用することができます。構文はRubyライクでもあり、Ruby on Rails 3.1でも正式にサポートされています。</p>

<h3>既存JSライブラリの使用方法</h3>

<p>どのJSライブラリでも、基本的には設定を要せず利用することが可能です。TypeScriptやHaxeのような定義ファイルを用意する必要はありません。</p>

<h3>コード例</h3>

<h4>CoffeeScriptのコード （v1.6.3）</h4>

<p>インデントやシンタックスシュガーを利用する文法の恩恵もあり、<strong>他のaltJSのサンプルと比べて最も少ないコード量</strong>となっています。TypeScriptと同様にアロー関数式を使うことができたり、「@」キーワードを使えることでthisの指し示すスコープがわかりやすいのが特徴でしょう。またパターンマッチングが利用できるため、①の箇所のように、文字列の中に変数を埋め込むことが可能です。</p>

<pre><code>:javascript:
window.onload = -&amp;gt;
  countManager = new CountManager

  $("#btn").click -&amp;gt;
    # カウントを更新
    countManager.addCount()
    # CSSの角度を計算
    rot = countManager.getCount() * 90
    # エレメントに適用
    $("#effect").css("transform", "rotateX(#{rot}deg)") #①

class CountManager
  _count: 0

  addCount: -&amp;gt;
    @_count++

  getCount: -&amp;gt;
    return @_count
</code></pre>

<h4>CoffeeScriptをコンパイルして生成したJavaScriptのコード</h4>

<p>CofeeScriptもオリジナルのコードが素直にJavaScriptとして出力されています。回避策はありますが、関数の最後の行がreturnステートメントで返されているところは少し戸惑うかもしれません。</p>

<pre><code>:javascript:
// Generated by CoffeeScript 1.6.3
(function() {
  var CountManager;

  window.onload = function() {
    var countManager;
    countManager = new CountManager;
    return $("#btn").click(function() {
      var rot;
      countManager.addCount();
      rot = countManager.getCount() * 90;
      return $("#effect").css("transform", "rotateX(" + rot + "deg)");
    });
  };

  CountManager = (function() {
    function CountManager() {}

    CountManager.prototype._count = 0;

    CountManager.prototype.addCount = function() {
      return this._count++;
    };

    CountManager.prototype.getCount = function() {
      return this._count;
    };

    return CountManager;

  })();

}).call(this);
</code></pre>

<ul>
<li><a href="http://clockmaker.jp/project/html5expertsjp/CoffeeScript/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CoffeeScript版デモを再生する</a></li>
</ul>

<h3>開発環境</h3>

<p>コンパイラを無償でダウンロードできるので、基本的にエディターは選びません。開発環境としてはVisual StudioやWebStorm/IntelliJ IDEAが対応しています。</p>

<p><img src="/wp-content/uploads/2013/09/webstorm_coffee.png" alt="WebStorm" /></p>

<p class="wp-caption-text">WebStormでCoffeeScriptを開発している様子</p>

<h3>筆者が考えるCoffeeScriptのメリットとデメリット</h3>

<p>メリットとしては、圧倒的なコード記述量の少なさです。JavaScriptのシンタックスシュガーと呼ばれるように、最小限のタイピングでどんどんコードがかけていく魅力があります。またインデントを利用する言語であることから、コードの可読性が必然的に高くなるのもメリットの一つです。</p>

<p>デメリットとしては型情報がないことによる、静的型チェックが無いことや開発環境でのコード補完利用の限界です(型情報がないとコード補完にノイズが入りがちになります)。こういったメリット・デメリットから少人数・小規模な体制でスピーディに開発する場合に向いているのではないかと考えています。</p>

<h2>Haxe</h2>

<p><img src="/wp-content/uploads/2013/09/haxe.png" alt="Haxe" /></p>

<h3>概要</h3>

<p><a href="http://haxe.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Haxe（ヘックス）</a>は静的型付け（ただし動的型も使用可能）のオブジェクト指向言語です。汎用プログラム言語でありJavaScriptの他にも、ActionScript、C++、C#、Java、PHPへのソースコードの変換が可能です。</p>

<p>Haxeは文法としては標準化が中止されたECMAScript 4に類似しており、Flashの開発言語ActionScript 3.0に似ているのが特徴です。数多くの機能を言語レベルで備えており、クラス/パッケージ機構、型推論、ジェネリクス、インライン関数、パターンマッチング、配列内包表記、構造的サブタイピング、高機能な列挙型（詳しくは[<a href="http://haxe.org/ref/enums?lang=jp" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">公式サイトの説明</a>]を参照ください）等の機能を持ち合わせています。コンパイラがOCamlという言語で開発されており、コンパイルが高速です。言語としての硬さ（厳密な型のチェック）やコンパイル速度の面から、大規模開発においてメリットがあります。</p>

<h3>既存JSライブラリの使用方法</h3>

<p>Haxeでは、Externと呼ばれるインターフェースを定義したファイルを用意します。Externファイルは自分で作成することも可能ですが、Haxe専用のパッケージ管理ツール「haxelib」を使うことで著名なJSライブラリのExternファイルをインスントールすることができます。</p>

<p>例：CreateJSのインストール方法
<code>haxelib install createjs
</code></p>

<h3>コード例</h3>

<h4>Haxeのコード （Haxe 3.0）</h4>

<p>HaxeはJavaScriptだけがターゲットの言語ではないため、JSのwindowオブジェクトにアクセスするには、Browserクラスのwindowプロパティを参照します。JavaScriptのオブジェクトを呼び出す際にはこういったラッパークラスを経由して呼び出す必要があります。jQueryを利用する場合は「new JQuery()」という形でインスタンスを作成して利用します。使い方は大きく異ならないもののHaxeの言語文化にあった形にライブラリのAPIが整理されている場合があるので注意が必要です。</p>

<pre><code>:javascript:
package ;
import js.Browser;
import js.JQuery;

class Main {    
    static function main() {
        new Main();
    }

    function new () {
        Browser.window.onload = init;
    }

    function init(e:Dynamic){
        var countManager:CountManager = new CountManager();

        new JQuery("#btn").click(function():Void {
            // カウントを更新
            countManager.addCount();
            // CSSの角度を計算
            var rot:Int = countManager.getCount() * 90;
            // エレメントに適用
            new JQuery("#effect").css("transform", "rotateX(" + rot + "deg)");
        });
    }
}

class CountManager {
    private var _count:Int = 0;
    public function new () {
    }
    public function addCount():Void {
        _count ++;
    }
    public function getCount():Int {
        return _count;
    }
}
</code></pre>

<h4>Haxeをコンパイルして生成したJavaScriptのコード</h4>

<p>Haxeでは、ECMAScript 5相当のJavaScriptを出力します。比較的読みやすいコードが出力されますが、下記の例ではBrowserオブジェクトやJQueryオブジェクトなど、ラッパーオブジェクトがそのままJavaScriptとして出力されています。出力されたコードは手を加えるのはあまり向いていないと言えるでしょう。</p>

<pre><code>:javascript:
(function () { "use strict";
var Main = function() {
    js.Browser.window.onload = $bind(this,this.init);
};
Main.main = function() {
    new Main();
}
Main.prototype = {
    init: function(e) {
        var countManager = new CountManager();
        new js.JQuery("#btn").click(function() {
            countManager.addCount();
            var rot = countManager.getCount() * 90;
            new js.JQuery("#effect").css("transform","rotateX(" + rot + "deg)");
        });
    }
}
var CountManager = function() {
    this._count = 0;
};
CountManager.prototype = {
    getCount: function() {
        return this._count;
    }
    ,addCount: function() {
        this._count++;
    }
}
var js = {}
js.Browser = function() { }
var $_, $fid = 0;
function $bind(o,m) { if( m == null ) return null; if( m.__id__ == null ) m.__id__ = $fid++; var f; if( o.hx__closures__ == null ) o.hx__closures__ = {}; else f = o.hx__closures__[m.__id__]; if( f == null ) { f = function(){ return f.method.apply(f.scope, arguments); }; f.scope = o; f.method = m; o.hx__closures__[m.__id__] = f; } return f; };
var q = window.jQuery;
js.JQuery = q;
js.Browser.window = typeof window != "undefined" ? window : null;
Main.main();
})();
</code></pre>

<ul>
<li><a href="http://clockmaker.jp/project/html5expertsjp/Haxe/bin/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Haxe版デモを再生する</a></li>
</ul>

<h3>開発環境</h3>

<p>コンパイラを無償でダウンロードできるので、基本的にエディターは選びません。開発環境としてはFlashDevelopの対応が特に充実しており、非常に強力な「あいまい補完」と言われるコード補完や、コード生成機能を利用することができます。</p>

<p><img src="/wp-content/uploads/2013/09/flashdevelop_haxe.png" alt="FlashDevelop" /></p>

<p class="wp-caption-text">FlashDevelopでHaxeを編集している様子</p>

<h3>筆者が考えるHaxeのメリットとデメリット</h3>

<p>メリットとしては、<strong>数多くの機能を言語レベルで搭載している点</strong>や、<strong>コンパイルが高速である点</strong>です。<strong>JavaScriptの名前空間の煩雑さやthisのスコープの苦労がなくなる</strong>のも大きなメリットの一つです。</p>

<p>デメリットとしては、<strong>言語が厳密過ぎる点</strong>です。基本的に型指定は必須ですし、暗黙的な型変換が利用できないので、慣れないうちはコンパイルエラーに苦労するでしょう。また出力されるJSファイルが一つにまとまることから、モジュール開発(JSライブラリ開発)には向いていないでしょう。</p>

<p>こういったメリット・デメリットから、<strong>大規模もしくはゲームや全画面Canvasのコンテンツなど、複雑なコンテンツを安全に開発する場合に向いている</strong>でしょう。
　</p>

<h2>まとめ</h2>

<p>私がaltJSを選ぶ際に必要と考えるのは、<strong>プロジェクトへの適正と、エンジニア/クリエイターのバックグラウンド</strong>だと考えています。それぞれのaltJSに影響を受けた言語があるように、開発に従事するエンジニアのバックグラウンドによって、言語のとっつきやすさに差があると思います。具体的にはRubyユーザーにはCoffeeScriptが、FlashユーザーにはHaxeが向いている傾向があるでしょう。利用するユーザーが様々なので<strong>altJSがどれか一つの言語に収束することはなく</strong>、勢力分布の変化はあれど基本的にはaltJSのユーザー数は並行して進化していくと筆者は考えています。</p>

<p>次回の後編では、altJS言語としてDartとJSXを紹介します。</p>

<h2>参照</h2>

<ul>
<li><a href="http://www.slideshare.net/sipojp/haxe-24876418" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">altJS勉強会「Haxeすごいからみんな使え！」
</a></li>
<li><a href="http://dev.hageee.net/29" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">altJS 勉強会で CoffeeScript について喋ってきました</a></li>
<li><a href="http://ics-web.jp/lab/archives/132" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HTML5デモ「日本全国花粉飛散マップ」を作って分かったCreateJSとTypeScriptでの効率的な開発手法 &#8211; ICS LAB</a></li>
</ul>
]]></content:encoded>
			</item>
		<item>
		<title>Web ComponentsベースのUIライブラリ「Brick」をMozillaが公開</title>
		<link>/shumpei-shiraishi/1873/</link>
		<pubDate>Wed, 28 Aug 2013 03:36:13 +0000</pubDate>
		<dc:creator><![CDATA[白石 俊平]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[W3C仕様]]></category>
		<category><![CDATA[Web Components]]></category>
		<category><![CDATA[マークアップ]]></category>

		<guid isPermaLink="false">/?p=1873</guid>
		<description><![CDATA[Web開発のあり方を大きく変えると期待されている、Web Components仕様に準拠した新たなUIコンポーネントライブラリをMozillaが開発していることが明らかになりました（今回のネタ元になった記事はこちら）。 ...]]></description>
				<content:encoded><![CDATA[<p>Web開発のあり方を大きく変えると期待されている、Web Components仕様に準拠した新たなUIコンポーネントライブラリをMozillaが開発していることが明らかになりました（<a href="https://hacks.mozilla.org/2013/08/introducing-brick-minimal-markup-web-components-for-faster-app-development/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">今回のネタ元になった記事はこちら</a>）。
その名も<a href="http://mozilla.github.io/brick/index.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Brick</a>です。
<span id="more-1873"></span></p>

<p>Brickは、Brickは、<a href="http://www.x-tags.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">X-Tag</a>というフレームワークの上で構築されています。
X-Tagは、Web Components仕様に準拠したカスタムコンポーネントを容易に作ることができるようにするフレームワークです。
また、X-Tagは<a href="http://www.polymer-project.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Polymer</a>というライブラリが提供するPolyfillを使用しており、IE9を含むモダンブラウザ上でWeb Componentsを利用可能にします。</p>

<h2>そもそもWeb Componentsってなに？</h2>

<p>Web Components仕様は様々な機能を提供しますが、その最も大きなものは、「カスタム要素を作れる」というものです。
例えば、Web Componentsを使用すると、以下の様なタグを記述するだけでその場にカレンダーを貼り付けることができるようになるというわけです。</p>

<pre><code>:html:
&lt;x-calendar&gt;&lt;/x-calendar&gt;
</code></pre>

<p>これだけでも、Web制作/開発に大きな影響を及ぼすということを感じていただけるのではないでしょうか。
その他、コンポーネントの内部をカプセル化する仕組み（<a href="http://www.w3.org/TR/shadow-dom/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Shadow DOM</a>）や、外部のコンポーネントをlink要素で参照する仕組み（<a href="https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/imports/index.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HTMLインポート</a>）などもWeb Componentsは規定しており、HTMLそのものをUIコンポーネント基盤として再構築しようとする、大胆な試みだと言っても過言ではないでしょう。</p>

<h2>Brickを試す</h2>

<p>繰り返しになりますが、BrickはX-Tag上で構築されたUIコンポーネントライブラリです。
それらのコンポーネントは、お使いのブラウザ上（IE9含む）で簡単に試すことができます。</p>

<p>・・・と言いたいところなのですが、現在のBrickにはバグがあるようで、うまく動かないコンポーネントもいくつかありました。
とりあえず、現在Brickが提供している14のコンポーネントのうち、一部を以下に紹介します。
以下の解説は、<a href="http://mozilla.github.io/brick/docs.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Brickのドキュメント</a>上のサンプルを、Google Chrome 29上で動作させたものになります。</p>

<h4>アプリケーションバー</h4>

<p>スマホアプリの上部に表示されるナビゲーションバーを簡単に作ることができます。</p>

<pre><code>    :html:
&lt;x-appbar&gt;
    &lt;div&gt;=&lt;/div&gt;
    &lt;header&gt;Title&lt;/header&gt;
    &lt;div&gt;+&lt;/div&gt;
    &lt;div&gt;?&lt;/div&gt;
&lt;/x-appbar&gt;
</code></pre>

<p><a href="https://html5experts.jp/wp-content/uploads/2013/08/appbar.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2013/08/appbar.png" alt="appbar" width="241" height="150" class="aligncenter size-full wp-image-1874" srcset="/wp-content/uploads/2013/08/appbar.png 241w, /wp-content/uploads/2013/08/appbar-207x128.png 207w" sizes="(max-width: 241px) 100vw, 241px" /></a></p>

<h4>カレンダー</h4>

<p>カレンダーを貼り付けることができます。うまく動作しなかったので、画像は<a href="https://hacks.mozilla.org/2013/08/introducing-brick-minimal-markup-web-components-for-faster-app-development/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">こちらのページ</a>に貼り付けてあったものを拝借しました。</p>

<pre><code>    :html:
&lt;x-calendar&gt;&lt;/x-calendar&gt;
</code></pre>

<p><a href="https://html5experts.jp/wp-content/uploads/2013/08/calendar.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2013/08/calendar.png" alt="calendar" width="251" height="235" class="aligncenter size-full wp-image-1875" srcset="/wp-content/uploads/2013/08/calendar.png 251w, /wp-content/uploads/2013/08/calendar-207x193.png 207w" sizes="(max-width: 251px) 100vw, 251px" /></a></p>

<h4>アイコンボタン</h4>

<p>アイコン付きのボタンを簡単に作ることができます。src属性に、アイコン画像のURLを指定します。しかし、現在のバージョンではアイコンがうまく描画されませんでした。</p>

<pre><code>    :html:
&lt;x-iconbutton src="firefox.png"&gt;
  アイコンボタンには＜code＞どんなマークアップでも＜/code＞書けます
&lt;/x-iconbutton&gt;
</code></pre>

<p><a href="https://html5experts.jp/wp-content/uploads/2013/08/iconbutton.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2013/08/iconbutton.png" alt="iconbutton" width="242" height="48" class="aligncenter size-full wp-image-1876" srcset="/wp-content/uploads/2013/08/iconbutton.png 242w, /wp-content/uploads/2013/08/iconbutton-207x41.png 207w" sizes="(max-width: 242px) 100vw, 242px" /></a></p>

<h4>レイアウト</h4>

<p>ヘッダー・ボディ・フッターというレイアウトを簡単に構築できます。ボディ部分は、コンテンツの高さに応じて自動的にスクロール領域となります。</p>

<pre><code>:html:
&lt;x-layout&gt;
    &lt;header&gt;
        I'm the header!
    &lt;/header&gt;
    &lt;section&gt;
        I'm the main body! &lt;p&gt;(I will automatically overflow if necessary.)&lt;/p&gt;&lt;p&gt;Filler text&lt;/p&gt;&lt;p&gt;Filler text&lt;/p&gt;&lt;p&gt;Filler text&lt;/p&gt;&lt;p&gt;Filler text&lt;/p&gt;&lt;p&gt;Filler text&lt;/p&gt;&lt;p&gt;Filler text&lt;/p&gt;&lt;p&gt;Filler text&lt;/p&gt;&lt;p&gt;Filler text&lt;/p&gt;&lt;p&gt;Filler text&lt;/p&gt;&lt;p&gt;Filler text&lt;/p&gt;
    &lt;/section&gt;
    &lt;footer&gt;
        I'm the footer!
    &lt;/footer&gt;
&lt;/x-layout&gt;
</code></pre>

<p><a href="https://html5experts.jp/wp-content/uploads/2013/08/layout.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2013/08/layout-200x300.png" alt="layout" width="200" height="300" class="aligncenter size-medium wp-image-1877" srcset="/wp-content/uploads/2013/08/layout-200x300.png 200w, /wp-content/uploads/2013/08/layout-138x207.png 138w, /wp-content/uploads/2013/08/layout.png 242w" sizes="(max-width: 200px) 100vw, 200px" /></a></p>

<h2>カスタムコンポーネントを自作する</h2>

<p>こうしたコンポーネントを自作することもできます。
X-Tagフレームワークを用いると、コンポーネントを簡単に作ることができます。
例えば以下に、前述した<a href="https://github.com/x-tag/appbar/blob/master/src/appbar.js" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">アプリケーションバーのソースコード</a>に、日本語でコメントを付与したものを示します。コンポーネントを容易に自作できるという雰囲気を感じ取って頂ければと思います。</p>

<pre><code>:javascript:
(function(){
  // カスタムタグの定義
  xtag.register('x-appbar', {
    // タグのライフサイクルメソッド
    lifecycle: {
      // タグが生成された時に呼び出されるコールバック
      created: function(){
        // 入れ子になったheader要素を取得する
        var header = xtag.queryChildren(this, 'header')[0];
        if (!header){
          header = document.createElement('header');
          this.appendChild(header);
        }
        this.xtag.data.header = header;
        this.subheading = this.subheading;
      }
    },
    // 要素の属性にアクセスする手段を提供する
    accessors: {
      heading: {
        // 属性の設定
        attribute: {},
        // 属性に値をセット
        get: function(){
          return this.xtag.data.header.innerHTML;
        },
        // 属性に値をセット
        set: function(value){
          this.xtag.data.header.innerHTML = value;
        }
      },
      subheading: {
        attribute: {},
        get: function(){
          return this.getAttribute('subheading') || "";
        },
        set: function(value){
          this.xtag.data.header.setAttribute('subheading', value);
        }
      }
    }
  });
})();
</code></pre>

<h2>まとめ</h2>

<p>Brickはまだ正式公開前ということもあり、バグも多く、デザインも洗練されていないのは仕方のないところです。今後に期待といったところでしょうか。</p>

<p>しかし、Web Componentsに関するライブラリをMozillaが公開したというところに、筆者は大きな意義を感じます。
Google主導で進められていると思われていたWeb Componentsに、Mozillaも強くコミットしていくということの現れとも言えるからです（実際Firefoxは、カスタム要素を作るための<code>document.register</code> APIを実装しています）。</p>

<p><a href="https://html5experts.jp/agektmr/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">エキスパートNo32のえーじさん</a>に昔教えていただいた情報によれば、Web Components仕様にはMicrosoftも強く関心を示しているとのこと。
そうなると、Microsoft, Mozilla, GoogleがWeb Componentsに前向きということになりますし、ChromiumをベースとしているOperaはもちろん、以前はGoogleが大きくコミットしていたWebKitにもWeb Componentsの一部は実装されているはずですので、SafariでもそのうちWeb Componentsを使えるようになる可能性があります。</p>

<p>Web Componentsによるマークアップ作業の大変革が起こるのは、意外とそう遠くない未来なのかもしれませんね。</p>
]]></content:encoded>
			</item>
		<item>
		<title>斉藤祐也の海外WEBテク定点観測＜Issue.3-2013/08/03-2013/08/16＞</title>
		<link>/cssradar/1431/</link>
		<pubDate>Sun, 18 Aug 2013 22:00:31 +0000</pubDate>
		<dc:creator><![CDATA[斉藤 祐也]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[デザイン]]></category>
		<category><![CDATA[Chrome]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Node.js]]></category>
		<category><![CDATA[パフォーマンス]]></category>
		<category><![CDATA[モバイル]]></category>
		<category><![CDATA[海外]]></category>

		<guid isPermaLink="false">/?p=1431</guid>
		<description><![CDATA[連載： 海外WEBテク最新動向 (3)Bret Victor氏によるプログラミングの未来について、Trent Walton氏によるユーザーエンゲージメントを高めるデザイン、そしてBoris Smus氏による思いがけないデ...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/web-tech/" class="series-151" title="海外WEBテク最新動向" data-wpel-link="internal">海外WEBテク最新動向</a> (3)</div><p>Bret Victor氏によるプログラミングの未来について、Trent Walton氏によるユーザーエンゲージメントを高めるデザイン、そしてBoris Smus氏による思いがけないデバイス連携方法など、14日間のWeb開発最新ニュース合計21件を紹介します！</p>

<p><span id="more-1431"></span></p>

<h2>注目ニュースピックアップ</h2>

<h3><a href="http://vimeo.com/71278954" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">プログラミングが迎えるべき未来 &#8211; Bret Victor</a></h3>

<p><img src="/wp-content/uploads/2013/08/Bret-Victor-The-Future-of-Programming-on-Vimeo.png" alt="Bret-Victor-The-Future-of-Programming-on-Vimeo" width="300" height="255" class="aligncenter size-full wp-image-1440" srcset="/wp-content/uploads/2013/08/Bret-Victor-The-Future-of-Programming-on-Vimeo.png 300w, /wp-content/uploads/2013/08/Bret-Victor-The-Future-of-Programming-on-Vimeo-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: The Future of Programming</p>

<p><strong><a href="http://worrydream.com/dbx/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">スライド/リファレンス</a></strong></p>

<p>インターネットが誕生してから約20年。コンピューターが身近なものになってからも、まだ決して長い時間が経ったとは言えない。iPadやiPod nanoの初期ユーザーインターフェイスコンセプトをデザインしたことで有名なBret Victor氏は時計を40年前に戻して、プログラミングが向かうべき未来について提唱。<br />
いつものことながらプレゼンテーションが非常にうまい。今回はさらにある一定の世代には懐かしさを覚えるユニークなスタイルでの発表。<br />
プログラミングは、まだこれからの分野だ。今ある常識を突き破ることができる。まだまだイノベーションが残る開拓地。</p>

<h3><a href="http://trentwalton.com/2013/08/12/human-interest/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">ユーザーエンゲージメントを得るために &#8211; Trent Walton</a></h3>

<p><img src="/wp-content/uploads/2013/08/human-interest-trent-walton-1024x768.png" alt="human-interest-|-trent-walton-1024x768" width="300" height="255" class="aligncenter size-full wp-image-1445" srcset="/wp-content/uploads/2013/08/human-interest-trent-walton-1024x768.png 300w, /wp-content/uploads/2013/08/human-interest-trent-walton-1024x768-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: Human Interest</p>

<p>プログレッシブ・エンハンスメントは技術的な面にだけにおけるベストプラクティスではなく、ユーザーエンゲージメントを高めるのにも利用できる。<br />
Trent Walton氏は、一流のホテルが行うようなお客様がホテルでの生活を最大限不便なく過ごせる仕組みやアプローチを、Webサイト／サービスにも同じように当てはめて考えるべきだと提言。<br />
ユーザーを礼儀正しく、尊敬の念を持って扱う事だけが本当の意味でエンゲージメントを高める唯一の方法だ。</p>

<h3><a href="http://smus.com/ultrasonic-networking/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">音を使ったデバイス連携 &#8211; Boris Smus</a></h3>

<p><img src="/wp-content/uploads/2013/08/ultrasonic-networking-on-the-web-boris-smus-1024x768.png" alt="ultrasonic-networking-on-the-web-|-boris-smus-1024x768" width="300" height="255" class="aligncenter size-full wp-image-1454" srcset="/wp-content/uploads/2013/08/ultrasonic-networking-on-the-web-boris-smus-1024x768.png 300w, /wp-content/uploads/2013/08/ultrasonic-networking-on-the-web-boris-smus-1024x768-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: ULTRASONIC NETWORKING ON THE WEB</p>

<p>モバイル端末は数多く存在し、それらをお互いが連携できるようにする技術も多く存在する。Boris Smus氏はそんなデバイス連携の技術に対して思いもよらない方法を実践して見せてくれる。<br />
その方法は音。<br />
Web Audioを使ってデータをデバイス間でやり取りすることの実現可能性、そしてその本意について詳しく紹介。<br />
この実験に使った<a href="https://github.com/borismus/sonicnet.js" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">ソースコードもオープンソースとして公開</a>しているので、ぜひそちらも参考にしてほしい。</p>

<h3><a href="http://blogs.adobe.com/digitalmedia/2013/08/are-mobile-web-apps-slow/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">モバイルWebは「本当に」遅いと言えるのか？ &#8211; DIGITAL MEDIA BLOG</a></h3>

<p><img src="/wp-content/uploads/2013/08/are-mobile-web-apps-slow-digital-media-blog-1024x768.png" alt="are-mobile-web-apps-slow?-|-digital-media-blog-1024x768" width="300" height="255" class="aligncenter size-full wp-image-1437" srcset="/wp-content/uploads/2013/08/are-mobile-web-apps-slow-digital-media-blog-1024x768.png 300w, /wp-content/uploads/2013/08/are-mobile-web-apps-slow-digital-media-blog-1024x768-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: Are Mobile Web Apps Slow?</p>

<p><a href="https://html5experts.jp/cssradar/919/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">本連載の第一回目</a>で紹介したDrew Crawford氏による、<a href="http://sealedabstract.com/rants/why-mobile-web-apps-are-slow/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">なぜモバイルWebアプリは遅いのか？</a>の記事に対するAdobeからの反論。<br />
Drew Crawford氏の主張も認めつつ、Webアプリが持つWebそのものの利点を活用しないのはもったいないとし、Webアプリは「トレンド」から脱し、当たり前の世の中になり始めたばかりであり、まだまだ期待できる点が多いはずだ。
Adobeに加えて、パフォーマンス観点でのネイティブ vs WebについてはいつでもWebの可能性について言及してくるSenchaも、<a href="http://www.sencha.com/blog/5-myths-about-mobile-web-performance/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">モバイルWebパフォーマンスに関する5つの迷信</a>について、詳しく解説しているので合わせて参考にしてほしい。</p>

<h3><a href="http://responsivenews.co.uk/post/21021136520/how-we-build-our-javascript" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">BBC NewsにおけるJavaScriptケーススタディ &#8211; Responsive News</a></h3>

<p><img src="/wp-content/uploads/2013/08/af534f1d57b1074bacb3f579b787d0d5.png" alt="responsive-news-—-how-we-build-our-javascript-1024x768" width="300" height="255" class="aligncenter size-full wp-image-1449" srcset="/wp-content/uploads/2013/08/af534f1d57b1074bacb3f579b787d0d5.png 300w, /wp-content/uploads/2013/08/af534f1d57b1074bacb3f579b787d0d5-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: How we build our Javascript</p>

<p>BBCといえば<a href="http://www.bbc.co.uk/gel" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">GEL</a>という非常に詳細なWebビジュアル言語のドキュメントを早々と公開するなど、これまでにも新聞社とは思えないほどWebに対しても多くの貢献をしてきているが、この記事ではそのGELの一部でもある独自JavaScriptフレームワーク、Glueからの脱却、そして新しいフレームワークの構築について詳しく解説。BBCがかなりの規模であることを考えると、旧ツールからの脱却コスト、新しいライブラリ選定、全体的なアーキテクチャのケーススタディは多くの開発者にとって参考になるだろう。</p>

<h2>海外トレンドコラム</h2>

<h3><a href="http://sethrobertson.github.io/GitBestPractices/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">知っておきたいGitのベストプラクティス &#8211; Seth Robertson</a></h3>

<p><img src="/wp-content/uploads/2013/08/ea2d7e5ffb53b02f9d0b0fc6c2051ec1.png" alt="commit-often,-perfect-later,-publish-once—git-best-practices-1024x768" width="300" height="255" class="aligncenter size-full wp-image-1441" srcset="/wp-content/uploads/2013/08/ea2d7e5ffb53b02f9d0b0fc6c2051ec1.png 300w, /wp-content/uploads/2013/08/ea2d7e5ffb53b02f9d0b0fc6c2051ec1-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: Commit Often, Perfect Later, Publish Once &#8211; Git Best Practices</p>

<p>バージョンコントロールそのものを利用していないケースは少なくなってきたと思うが、SVNからGitに移行したばかりで、どうやってGitを運用していくかが分からないケースはまだまだあるだろう。この記事ではかなり詳細までGitを使ったベストプラクティスについてまとめているので、その際には参考になるだろう。</p>

<h3><a href="http://www.crispymtn.com/stories/the-algorithm-for-a-perfectly-balanced-photo-gallery" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">アルゴリズムを使ってフォトギャラリーを作る方法 – Summit Stories from Crispy Mountain</a></h3>

<p><img src="/wp-content/uploads/2013/08/177457035a5b7b99eeeb234c5e6d4b56.png" alt="the-algorithm-for-a-perfectly-balanced-photo-gallery-–-summit-stories-from-crispy-mountain-1024x768" width="300" height="255" class="aligncenter size-full wp-image-1452" srcset="/wp-content/uploads/2013/08/177457035a5b7b99eeeb234c5e6d4b56.png 300w, /wp-content/uploads/2013/08/177457035a5b7b99eeeb234c5e6d4b56-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: The algorithm for a perfectly balanced photo gallery</p>

<p>（私自身はそうではないが）Web業界で働いている人でコンピューターサイエンス系の専攻だった方も多いだろう。そんな授業でしか学ばなかったいつになったら役に立つのか分からないアルゴリズムを活かして、効率的なフォトギャラリーをJavaScriptで実装。</p>

<h3><a href="http://hub.tutsplus.com/tutorials/the-new-ie11-f12-tools--net-34039" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">非常に強力なIE11のブラウザ開発者ツールについて &#8211; Tuts+</a></h3>

<p><img src="/wp-content/uploads/2013/08/ed4b810d5493efa148f0fdda6110cf68.png" alt="the-new-ie11-f12-tools---tuts+-1024x768" width="300" height="255" class="aligncenter size-full wp-image-1453" srcset="/wp-content/uploads/2013/08/ed4b810d5493efa148f0fdda6110cf68.png 300w, /wp-content/uploads/2013/08/ed4b810d5493efa148f0fdda6110cf68-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: The New IE11 F12 Tools</p>

<p>ブラウザの開発者用ツールといえば、ChromeやFirefoxがすぐに頭に浮かぶかもしれないが、IE11に搭載されているツールもかなり強力になってきている。<br />
クロスブラウザ開発で確実に威力を発揮するIE11の開発者ツールの使い方をしっかり解説している。</p>

<h3><a href="http://angular-tips.com/blog/2013/08/why-does-angular-dot-js-rock/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Angular.jsがなぜ「かっこいい」のか？ &#8211; Angular Tips</a></h3>

<p><img src="/wp-content/uploads/2013/08/why-does-angular.js-rock-angular-tips-1024x768.png" alt="why-does-angular.js-rock?---angular-tips-1024x768" width="300" height="255" class="aligncenter size-full wp-image-1455" srcset="/wp-content/uploads/2013/08/why-does-angular.js-rock-angular-tips-1024x768.png 300w, /wp-content/uploads/2013/08/why-does-angular.js-rock-angular-tips-1024x768-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: Why Does Angular.js Rock?</p>

<p>Angular.jsがなんで「かっこいい」のかについて、わかりやすく、実例とともに紹介。
この記事が公開されてすぐに<a href="https://kerricklong.com/articles/why-ember-js-rocks.html" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">同じような形式でEmber.jsの紹介</a>も公開されていた。こういうやりとりはWebの面白いところの1つ。</p>

<h3><a href="http://www.toptal.com/javascript/guide-to-full-stack-javascript-initjs" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">JavaScriptの「フルスタック」アーキテクチャ &#8211; Toptal</a></h3>

<p><img src="/wp-content/uploads/2013/08/backbone-node-express-and-more-an-introduction-to-full-stack-javascript-with-init.js-toptal-1024x768.png" alt="backbone,-node,-express,-and-more:-an-introduction-to-full-stack-javascript,-with-init.js-|-toptal-1024x768" width="300" height="255" class="aligncenter size-full wp-image-1439" srcset="/wp-content/uploads/2013/08/backbone-node-express-and-more-an-introduction-to-full-stack-javascript-with-init.js-toptal-1024x768.png 300w, /wp-content/uploads/2013/08/backbone-node-express-and-more-an-introduction-to-full-stack-javascript-with-init.js-toptal-1024x768-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: Backbone, Node, Express, and More: An Introduction to Full-Stack JavaScript, with Init.js</p>

<p>Init.jsという素っ気ない名前ながら、なかなかどうして前のめりな開発アプローチを紹介。フロントはもちろん、サーバーサイドもNode.js(Express.js)、データベースもMongoDBと隅から隅までJavaScriptで構成するアプローチの利点や背景について詳しく解説している。<br />
この記事とは直接的には関連はないが、記事で紹介されたようなJavaScriptのみを使ってフルスタックを実現するMEAN（MongoDB、Express、Angular.js、Node.js）ボイラープレートも話題になっていて MEANの一例として<a href="http://mean.io/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Mean</a>というのもすでに公開されているので参考まで。</p>

<h3><a href="http://learningthreejs.com/blog/2013/08/02/how-to-do-a-procedural-city-in-100lines/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">たった100行のJavaScriptで創る3Dの街風景 &#8211; Learning Three.js</a></h3>

<p><img src="/wp-content/uploads/2013/08/how-to-do-a-procedural-city-in-100-lines-learning-three.js-1024x768.png" alt="how-to-do-a-procedural-city-in-100-lines---learning-three.js-1024x768" width="300" height="255" class="aligncenter size-full wp-image-1444" srcset="/wp-content/uploads/2013/08/how-to-do-a-procedural-city-in-100-lines-learning-three.js-1024x768.png 300w, /wp-content/uploads/2013/08/how-to-do-a-procedural-city-in-100-lines-learning-three.js-1024x768-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: How to Do a Procedural City in 100 Lines</p>

<p>Webにおける3Dの表現はまだまだこれから、という風に考えているかもしれないが、Three.jsを使ってたった100行でランダム（に見える）街の風景を作り出す実装について解説。</p>

<h3><a href="http://blogs.adobe.com/webplatform/2013/08/06/gradientmaps-js-gradient-maps-for-html/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">グラデーションマップをWebで実現する &#8211; Web Platform Team Blog</a></h3>

<p><img src="/wp-content/uploads/2013/08/3c91ec3155413abe52c31f94691f3be8.png" alt="gradientmaps.js-–-gradient-maps-for-the-web-|-web-platform-team-blog-1024x768" width="300" height="255" class="aligncenter size-full wp-image-1443" srcset="/wp-content/uploads/2013/08/3c91ec3155413abe52c31f94691f3be8.png 300w, /wp-content/uploads/2013/08/3c91ec3155413abe52c31f94691f3be8-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: gradientmaps.js – Gradient Maps for the Web</p>

<p>Photoshopでしか表現できないと思っている様々なことは実はブラウザで、つまりJavaScriptで、あるいはCSSで表現できるようになりつつある。<br />
この記事はAdobe社自らグラデーションマップをブラウザで表現する方法を紹介。この記事で使っている<a href="https://github.com/awgreenblatt/gradientmaps" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">ソースコード</a>はオープンソースとして公開されている。</p>

<h3><a href="http://www.mobify.com/blog/base64-does-not-impact-data-uri-performance/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">DataURIのパフォーマンス: Base64が悪者ではない？ &#8211; Mobify</a></h3>

<p><img src="/wp-content/uploads/2013/08/data-uri-performance-dont-blame-it-on-base64-mobify-1024x768.png" alt="data-uri-performance:-don&#039;t-blame-it-on-base64-|-mobify-1024x768" width="300" height="255" class="aligncenter size-full wp-image-1442" srcset="/wp-content/uploads/2013/08/data-uri-performance-dont-blame-it-on-base64-mobify-1024x768.png 300w, /wp-content/uploads/2013/08/data-uri-performance-dont-blame-it-on-base64-mobify-1024x768-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: Data URI Performance: Don&#8217;t Blame it on Base64</p>

<p><a href="https://html5experts.jp/cssradar/1137/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">前回の本連載にて紹介</a>した、<a href="http://www.mobify.com/blog/data-uris-are-slow-on-mobile/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">モバイルブラウザではDataURIは画像を読み込むよりも6倍時間がかかる</a>の再調査記事。前回はBase64でエンコードされたデータをデコードするのに時間がかかっているとしていたが、今回の調査では「DataURI全般の処理そのものがかかっているのでは？」という仮説で終わっている。 </p>

<h2>クローズアップ“ビデオ/スライド”</h2>

<h3><a href="http://www.youtube.com/watch?v=-WpDN2k7vbU" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">ストレスフリーの開発環境のためにできること &#8211; Rebecca Murphey</a></h3>

<p><img src="/wp-content/uploads/2013/08/JSConfUS-2013-Rebecca-Murphey-Optimizing-for-Developer-Delight-YouTube.png" alt="JSConfUS-2013-Rebecca-Murphey-Optimizing-for-Developer-Delight-YouTube" width="300" height="255" class="aligncenter size-full wp-image-1436" srcset="/wp-content/uploads/2013/08/JSConfUS-2013-Rebecca-Murphey-Optimizing-for-Developer-Delight-YouTube.png 300w, /wp-content/uploads/2013/08/JSConfUS-2013-Rebecca-Murphey-Optimizing-for-Developer-Delight-YouTube-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: Optimizing for Developer Delight</p>

<p><strong><a href="https://speakerdeck.com/rmurphey/optimizing-for-developer-delight" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">スライドはこちら</a></strong>。</p>

<p>新天地で活躍し始めたばかりのRebecca Murphey氏はこの3カ月、開発者達がよりストレスなく開発できる環境を作ることに注力してきたそう。JavaScriptのアーキテクチャそのものはもちろん、自動化やログ出力など問題に対する実利的な解決を紹介している。</p>

<h3><a href="http://vimeo.com/70171266" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">あなたの知らないCSS3 border-radiusのすべて &#8211; Lea Verou</a></h3>

<p><img src="/wp-content/uploads/2013/08/Lea-Verou-The-humble-border-radius-CSS-Day-on-Vimeo.png" alt="Lea-Verou-The-humble-border-radius   CSS-Day-on-Vimeo" width="300" height="255" class="aligncenter size-full wp-image-1447" srcset="/wp-content/uploads/2013/08/Lea-Verou-The-humble-border-radius-CSS-Day-on-Vimeo.png 300w, /wp-content/uploads/2013/08/Lea-Verou-The-humble-border-radius-CSS-Day-on-Vimeo-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>原題: The humble border-radius</p>

<p><strong><a href="http://lea.verou.me/humble-border-radius/#for-browser" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">スライドはこちら</a></strong>。</p>

<p>CSS3の角丸というベーシックな機能をここまで深堀して解説できるのは、Lea Verou氏以外にはおそらくいないだろう。<br />
スライドそのものがインタラクティブに操作可能な学習リソースになっているので、動画を見る時間が取れなくても、スライドはぜひ見てほしい。</p>

<h2>一歩先行く“コード・ライブラリ”</h2>

<h3><a href="https://github.com/creationix/js-git" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">js-git &#8211; Tim Caswell</a></h3>

<p><img src="/wp-content/uploads/2013/08/54b21b6892b9856680adf235fd717efa.png" alt="js-git-·-github-1024x768" width="300" height="255" class="aligncenter size-full wp-image-1446" srcset="/wp-content/uploads/2013/08/54b21b6892b9856680adf235fd717efa.png 300w, /wp-content/uploads/2013/08/54b21b6892b9856680adf235fd717efa-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>JavaScriptによるGitの実装。<br />
一見して車輪の再発明のように思えるが、様々な環境で動作するJavaScriptでGitを実装することは意味は大きい。
KickStarter、そしてBountysourceでのファンドを成功させ順調に開発に専念できている様子。</p>

<h3><a href="http://jlord.github.io/sheetsee.js/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Sheetsee.js &#8211; Jessica Lord</a></h3>

<p><img src="/wp-content/uploads/2013/08/yo-yo-yo-1024x768.png" alt="yo,-yo,-yo!-1024x768" width="300" height="255" class="aligncenter size-full wp-image-1456" srcset="/wp-content/uploads/2013/08/yo-yo-yo-1024x768.png 300w, /wp-content/uploads/2013/08/yo-yo-yo-1024x768-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>データのビジュアル表現をサポートするJavaScriptツールは今ではかなりの数があるが、このSheetsee.jsはGoogle Spreadsheetをデータポイントとして利用できる点がユニーク。</p>

<h3><a href="http://passportjs.org/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Passport &#8211; Jared Hanson</a></h3>

<p><img src="/wp-content/uploads/2013/08/passport-simple-unobtrusive-authentication-for-node.js.-1024x768.png" alt="passport---simple,-unobtrusive-authentication-for-node.js.-1024x768" width="300" height="255" class="aligncenter size-full wp-image-1448" srcset="/wp-content/uploads/2013/08/passport-simple-unobtrusive-authentication-for-node.js.-1024x768.png 300w, /wp-content/uploads/2013/08/passport-simple-unobtrusive-authentication-for-node.js.-1024x768-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>PassportはNode.js用でFacebookやTwitterなどのログインの実装を行うツール。ログイン周りは何かと面倒な点が多いので、非常に便利に使えるだろう。</p>

<h2>海外で話題の“ツール”</h2>

<h3><a href="http://ember-doc.com/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Ember.jsドキュメント 検索機能付き</a></h3>

<p><img src="/wp-content/uploads/2013/08/searchable-ember-doc-1024x768.png" alt="searchable-ember-doc-1024x768" width="300" height="255" class="aligncenter size-full wp-image-1450" srcset="/wp-content/uploads/2013/08/searchable-ember-doc-1024x768.png 300w, /wp-content/uploads/2013/08/searchable-ember-doc-1024x768-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>Ember.jsのドキュメントを検索できるWebツール。<br />
ドキュメントとしてもかなり充実しているようで、学習コストが高めのEmber.jsのようなフレームワークの利用を促進してくれそうだ。</p>

<h3><a href="http://www.svgeneration.com/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">SVGeneration</a></h3>

<p><img src="/wp-content/uploads/2013/08/showcase-svgeneration-1024x768.png" alt="showcase-|-svgeneration-1024x768" width="300" height="255" class="aligncenter size-full wp-image-1451" srcset="/wp-content/uploads/2013/08/showcase-svgeneration-1024x768.png 300w, /wp-content/uploads/2013/08/showcase-svgeneration-1024x768-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>様々な場面で利用できるテクスチャを提供している<a href="https://www.toptal.com/designers/subtlepatterns/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Subtle Patterns</a>と同じコンセプトのSVGバージョン。SVGの利用はクロスブラウザという観点ではまだまだと思うかも知れないが、何かの際に知っておけば便利に使える事は間違いない。</p>

<h3><a href="http://developer.att.com/developer/forward.jsp?passedItemId=13800072" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">AT&amp;T ARO</a></h3>

<p><img src="/wp-content/uploads/2013/08/att-developer-program-1024x768.png" alt="at&amp;t-developer-program-1024x768" width="300" height="255" class="aligncenter size-full wp-image-1438" srcset="/wp-content/uploads/2013/08/att-developer-program-1024x768.png 300w, /wp-content/uploads/2013/08/att-developer-program-1024x768-207x175.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<p>モバイルWeb開発においてネックになるのが、実機を使ってのネットワークパフォーマンスの解析だろう。このAT&amp;Tが提供するAT&amp;T AROツールはそんな問題を解決するためのツール。Google PageSpeed Insightsのような最適化のコツまで教えてくれる。</p>

<p>★次回の「斉藤祐也の海外WEBテク定点観測」は、9月2日にお届け予定です。★</p>
]]></content:encoded>
		
		<series:name><![CDATA[海外WEBテク最新動向]]></series:name>
	</item>
	</channel>
</rss>
