<?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>ES6 &#8211; HTML5Experts.jp</title>
	<atom:link href="/tag/es6/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>ポエム駆動開発がエッジすぎる！白石俊平がピクシブの開発環境について、聞いてみた！</title>
		<link>/miyuki-baba/17613/</link>
		<pubDate>Wed, 02 Dec 2015 00:00:03 +0000</pubDate>
		<dc:creator><![CDATA[馬場 美由紀]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[Assault]]></category>
		<category><![CDATA[ES6]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[React]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[esa]]></category>
		<category><![CDATA[idobata]]></category>
		<category><![CDATA[ピクシブ]]></category>

		<guid isPermaLink="false">/?p=17613</guid>
		<description><![CDATA[次々と登場する開発ツールや言語のバージョンアップ。開発スピードがどんどん早くなるWeb業界ですが、実際に企業の開発現場ではどのように開発環境やツール・体制などを構築しているのか──。 HTML5 Experts.jp白石...]]></description>
				<content:encoded><![CDATA[<p>次々と登場する開発ツールや言語のバージョンアップ。開発スピードがどんどん早くなるWeb業界ですが、実際に企業の開発現場ではどのように開発環境やツール・体制などを構築しているのか──。</p>

<p>HTML5 Experts.jp白石俊平編集長が、根ほり葉ほり聞いちゃうシリーズ・第一弾は、ピクシブを訪問！HTML5 Experts.jpのエキスパートでもある川田寛<a href="https://twitter.com/_furoshiki" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">@_furoshiki</a>さんと片倉<a href="https://twitter.com/geta6" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">@geta6</a>さんにお話を聞いてきました。</p>

<p><img src="/wp-content/uploads/2015/11/pixiv-1.jpg" alt="" width="640" height="469" class="aligncenter size-full wp-image-17614" srcset="/wp-content/uploads/2015/11/pixiv-1.jpg 640w, /wp-content/uploads/2015/11/pixiv-1-300x220.jpg 300w, /wp-content/uploads/2015/11/pixiv-1-207x152.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>クリエイターがやんちゃして遊べる基地ピクシブ</h2>

<p><strong>白石：</strong>まずはピクシブのサービスや、川田さんが今どんな業務を担当しているのか聞かせてください。</p>

<p><strong>川田：</strong>ピクシブでは「創作活動をもっと楽しくする」という理念を持って、いろんなサービスを提供しています。イラスト・漫画・小説が投稿できる「<a href="http://www.pixiv.net/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">pixiv</a>」以外にも、ネットショップサービス「<a href="https://booth.pm/ja" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">BOOTH</a>」やグッズ制作サービス「<a href="https://factory.pixiv.net/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">pixivFACTORY</a>」といったECサービス、お絵かきアプリ「<a href="https://sketch.pixiv.net/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">pixiv Sketch</a>」とか、いろいろな創作活動向けのサービスを提供しています。</p>

<p><img src="/wp-content/uploads/2015/11/DSC08801.jpg" alt="" width="640" height="441" class="aligncenter size-full wp-image-17638" srcset="/wp-content/uploads/2015/11/DSC08801.jpg 640w, /wp-content/uploads/2015/11/DSC08801-300x207.jpg 300w, /wp-content/uploads/2015/11/DSC08801-207x143.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /><span style="font-size: 80%"><strong>▲ピクシブ株式会社　エンジニア　川田寛さん</strong></span></p>

<p>私がメインとして担当しているのは　CtoCのECサービスです。同人イベントなどであつかわれる創作物の頒布を、どうやったらネットの力で便利に変えられるのかって、いつも考えてますね。主に「BOOTH」と「pixivFACTORY」を担当しています。</p>

<p><strong>白石：</strong>グッズ化したり、販売できたりするサービスですよね。ピクシブならではの強みってあります？</p>

<p><strong>川田：</strong>「創作活動をしている人」にフォーカスしているところでしょうね。そういう人たちに愛されるサービスにできていると思っているし、社内の空気としても、クリエーターに対する尊敬があって、彼らをどう幸せにできるのかを考えていたりして。</p>

<p>たとえばBOOTHだと、普通のECサービスじゃ採算があわないという理由で蔑ろにされてもおかしくないような作品を作っている人も、ちゃんと大切にできる。例えば、マニアックすぎて日の目を見ない人たちも気軽に参加できるし、投資できるような仕組みも作っています。普通なら500円くらいでしか売れない作品でも、その価値を認めた人は1000円とか1万円というように、購入者側の評価価格で購入できるような仕組みを作ったりとか。</p>

<h2>朝思いついたことをすぐコードで書くスピード感</h2>

<p><strong>白石：</strong>川田さんは入社したばかりですけど、前職との違いをどう感じてますか？</p>

<p><strong>川田：</strong>前は100年以上歴史があったりとか、受託をメインとしている企業だったので、ピクシブとは何もかもが真逆ですね。社員の年代も若いし、サービスもまだできて7年くらい。開発言語一つとっても、今まではJavaがメインだったのが、RubyやPHP、Scala、Goなど、前の会社だったら絶対に手を出さなかったような言語もガンガン使っています。</p>

<p>開発するものについても、大規模な受託案件で、1年以上先にリリースされるようなウォーターフォール型が多かったのですが、ピクシブは自社開発で、それこそ朝に思いついた良いアイデアはその日のうちにコードを書いて形にしてリリースしたりすることもあります。ユーザーに価値を提供していく上で、とにかくスピード感が命なので、そのために多くの権限を現場に委ねているというかんじがしています。</p>

<p><strong>白石：</strong>全然違うんですね。コードを書くってことは、川田さんはプログラマ寄りの仕事なんですか？</p>

<p><strong>川田：</strong>UIまわりが多く、フロントエンドエンジニアをやってます。サーバーサイドも書くときは書きます。うちの会社はフロントエンジニアが3人いますが、みんな特にフロントエンドだけをやっているという感じではありませんね。iOSとかAndroidを作るアプリエンジニアもいますが、あまり境目がなくて何でもやっているというかんじがします。前職はお客様対応みたいなのが絡むので、SEという言葉がぴったりハマるような仕事だったのですが、今は完全にエンジニアです。コードを書くことで、ユーザーへの価値を発揮しています。</p>

<p><strong>白石：</strong>そうなると、仕様策定は誰がやるんでしょうか。</p>

<p><strong>川田：</strong>大きな機能追加とかロードマップは、ディレクターがまとめたり経営層を巻き込んだりしていますが、そうでないものは現場で考えてスピーディーにやってしまいます。</p>

<p><img src="/wp-content/uploads/2015/11/DSC08879.jpg" alt="" width="640" height="425" class="aligncenter size-full wp-image-17661" srcset="/wp-content/uploads/2015/11/DSC08879.jpg 640w, /wp-content/uploads/2015/11/DSC08879-300x199.jpg 300w, /wp-content/uploads/2015/11/DSC08879-207x137.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /><span style="font-size: 80%">　▲ピクシブ株式会社のオフィスには、いたるところに絵師さんのイラストが描かれている。</span></p>

<h2>ポエムはesa、意見交換・情報共有はidobataで</h2>

<p><strong>川田：</strong>うちの会社にはポエム駆動開発というのがあるんです。コードがかけるだけじゃなくて、創作をする人に対して想いが強い人が入社してくる。エンジニアにも想いが強い人がいっぱいいるので、ポエムを通じて刺激されて作る。</p>

<p><strong>白石：</strong>へえ。川田さんはどんなポエムを書いたんですか？</p>

<p><strong>川田：</strong>新サービスとかユーザーの声とかいろんな話が絡んでてあまりまだ公表できない話も多いのですが。作品を扱っているサービスとしては、やはり、それを求めているユーザーとうまく繋いであげないことには、出展しているクリエーターやアーティストさんにとっても良くないわけで。そこをどう改善していけばいいのか、というお話をしていました。</p>

<p>社内では<a href="https://esa.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">esa</a>というツールを使ってポエムを語るんです。このサービスはこうやったら成功するんじゃないかって書くと、みんなが反応を示していく。そうやってどんどんプロダクトを改善したり、新しく作り出したりしていますね。</p>

<p><img src="/wp-content/uploads/2015/11/DSC08785.jpg" alt="" width="640" height="425" class="aligncenter size-full wp-image-17659" srcset="/wp-content/uploads/2015/11/DSC08785.jpg 640w, /wp-content/uploads/2015/11/DSC08785-300x199.jpg 300w, /wp-content/uploads/2015/11/DSC08785-207x137.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><strong>白石：</strong>現場から上がってくるボトムアップなかんじがいいですね。</p>

<p><strong>川田：</strong>何を作るのかとか、どう改善するかは現場から上げていけますね。経営層も「お前らでドラスティックに変えていってくれ」って言ってくれて。</p>

<p><strong>白石：</strong>チーム体制は何人くらいでやってるんですか？</p>

<p><strong>川田：</strong>うちのチームだと、BOOTHとpixivFactoryであわせて10名弱くらい。両方ともRailsなど同じ道具を使って作っているので、エンジニアはどちらもみている感じですね。</p>

<p><strong>白石：</strong>アジャイルで開発しているんでしたっけ。</p>

<p><strong>川田：</strong>うちのチームではアジャイルと呼べるほど、そこまできっちりしていません。どちらかといえばDevOpsが自然に機能しているという印象。大きな機能リリースに向けた開発はしているけれど、それだけをメインとしてやってはいられない。いま動いているものに問題があれば、そこで対応もしなくてはいけないので。サポートチームのフィードバックであったり、エゴサーチして問題を探って、<a href="https://idobata.io/ja/home" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">idobata</a>で即座に共有されたり。</p>

<p><strong>白石：</strong>エゴサーチを開発チームがしているのはすごい。社内のコミュニケーションツールは<a href="https://slack.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Slack</a>じゃないんですね。idobataって、Slackと比べてどうなんですか？使いやすいとか。</p>

<p><strong>川田：</strong>Slackとidobataを使ってはいますが、うちのチームだとidobataの方がメインになりましたね。自分たちの使っている範囲で、機能面にそこまでの違いは感じてはいません。Slackはチームごとで導入してしまっているからか、会社全体として導入しているidobataのほうがオープンに議論が交わされてて。他のチームのスレをみて気軽に意見を言ったり、挙句にプルリクを作って後方支援することもあったり。プロダクトやチームを超えて議論がされていますね。</p>

<h2>タスク管理はカンバン。具体的なタスクはGitHub</h2>

<p><strong>白石：</strong>タスク管理は何を使ってます？</p>

<p><strong>川田：</strong>うちのチームだと、タスク管理はカンバン。ToDoリストとしてざっくりタスクをポストイットで並べてます。トラブルがあったらそっちを優先したり、技術的な問題で遅れることもあります。タスクも今まで見てきた中ではわりと独立性が高いとおもってて、エンジニアやデザイナー、ディレクターやサポート担当者など、全員にビルド/デプロイ権限があって、自分たちが主体になってデプロイにまでもっていく。とはいえ、リーダーが責任をとるとか、デプロイした人が責任をとるとかそういうものもなく、リスクはチーム全体でうまく運用方法を改善しながらカバーしていきます。</p>

<p><img src="/wp-content/uploads/2015/11/DSC08778.jpg" alt="" width="640" height="440" class="aligncenter size-full wp-image-17653" srcset="/wp-content/uploads/2015/11/DSC08778.jpg 640w, /wp-content/uploads/2015/11/DSC08778-300x206.jpg 300w, /wp-content/uploads/2015/11/DSC08778-207x142.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>細かい機能とかコードレベルの話はGitHubです。プライベートのリポジトリ上に、Issue立てたり、PullRequest作ってMergeして、みたいなかんじです。よくあるGitHubの普通な運用方法になるとおもいます。</p>

<p>想いとか、こうやったほうがいいというポエムは<a href="https://esa.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">esa</a>、具体的なのはGitHubです。全体像はカンバンで、普段のコミュニケーションはidobataがメインです。</p>

<p><img src="/wp-content/uploads/2015/11/DSC08779.jpg" alt="" width="640" height="429" class="aligncenter size-full wp-image-17654" srcset="/wp-content/uploads/2015/11/DSC08779.jpg 640w, /wp-content/uploads/2015/11/DSC08779-300x201.jpg 300w, /wp-content/uploads/2015/11/DSC08779-207x139.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><strong>白石：</strong>ほかに開発体制で面白いトピックはありますか？</p>

<p><strong>川田：</strong>開発体制とは違うかもしれないんですけど、前の会社ではコミュニケーション手段がほぼメールと電話だけだったんです。それがこの会社に来てからは、メールと電話は一切使ったことがない。一度もです。ツールをしっかり固めて、コミュニケーションコストを下げると、得られる情報量が大きくなって、結果としてチームを超えていろんな情報にアクセスできるんです。ツールひとつで、ここまで組織がフラットになれるものなんですね。</p>

<p>ただ一方で、まずいと思うところもあって。メールや電話といったツールは、一般的なビジネスでは必須のコミュニケーションツールですよね。オーバーヘッドはとてつもなく大きいのですが、使わなくなるとそれはそれで、マナーやルールがわからなくなって社会から取り残されていく不安も感じるんです。両方のバランスが重要と感じています。</p>

<p><strong>白石：</strong>社員同士のやりとりは何を使ってるんですか？</p>

<p><strong>川田：</strong>一部はSkypeですが、基本はidobataでオープンにしてます。idobataのタイムライン上には、社員同士のやりとりだけじゃなく、自動的にデプロイの情報が流れてきたり、サポートの状況とかが流れてきたりで、社員同士のやりとりが発生しやすいというかんじがしています。</p>

<h2>インフラはコンシューマ向きの超安いサーバー？</h2>

<p><strong>白石：</strong>開発環境はどうですか？</p>

<p><strong>川田：</strong>開発環境の話だと、うちにはちょっとした特殊なインフラがありまして。初期のpixivは社長が借金をして買ってきた大量のサーバーがあるのですが。コンシューマー向けの安いマザーボードを、ラックにくくりつけて使ってるんですよ。ほんとうにむき出しのままなんです(笑)。</p>

<p><img src="/wp-content/uploads/2015/11/DSC08793.jpg" alt="" width="640" height="412" class="aligncenter size-full wp-image-17658" srcset="/wp-content/uploads/2015/11/DSC08793.jpg 640w, /wp-content/uploads/2015/11/DSC08793-300x193.jpg 300w, /wp-content/uploads/2015/11/DSC08793-207x133.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>さすがに今は本番環境をデータセンターに預けるようにしていますが、開発環境には未だにそのマザーボードむき出しのサーバーをインフラとして使ってるんです。インフラチームの図画工作スキルは、いまだに高いようですね(笑)。</p>

<p>インフラの話をもう少し突っ込んですると、pixivの場合はサービスの特性上、クラウドよりオンプレのほうが向いていてそっちが中心ですね。とはいえ、ところどころにクラウドは使われていて、新しいプロジェクトだとAWSみたいなクラウドも使われています。</p>

<p>データベースは、基本的にはMySQL使ってます。OSはLinux。新しいプロジェクトはRails使うことが多いんですが、「Rails最強!! Railsじゃないとダメだ！」みたいな人はいなくて、ツールとして使っているという印象です。</p>

<h2>サービスはリリースした時の最新技術で</h2>

<p><strong>白石：</strong>HTML5 Experts.jpはフロントエンド開発者が主な読者なので、フロントエンド開発の話も聞かせてもらえますか？</p>

<p><strong>川田：</strong>私が関わるBOOTHだと、マークアップはSlim、CSSはSASSやCoffeeScriptとか。Ruby書いている人にやりやすい環境で整っています。また、開発したのが2013年なので、CoffeeScript、Backbone.js、Marionette.jsなどを使ってます。いまだとReactあたりがもっと上手く問題を解決してくれたりするんでしょうし、SPA（Single page application）ももっといいやり方があるのでしょうが、当時の技術を使っているので…。</p>

<p>とはいえ、2007年に作られたpixivでも、CoffeeScriptが使われていたりはします。部分的に入れ替えも進んでいます。今年の6月にリリースしたお絵かきアプリ「pixiv Sketch」は、React.jsやBabelが使われています。もろ時代の影響を受けていますね。</p>

<p><strong>白石：</strong>それだけフロントエンドの流れが早いってことですね。</p>

<p>フロントエンドだと、そこそこエッジな事例がきけそうな、pixiv Sketchのエンジニアを呼んでみますね。</p>

<h2>ReactとFluxでサーバーサイドレンダリング</h2>

<p>──ということで、geta6さんにご登場いただきました。</p>

<p><strong>geta6：</strong>片倉@geta6です。「pixiv Sketch」の担当エンジニアをしています。</p>

<p><strong>白石：</strong>ぜひ、フレームワーク周りで面白い話を聞かせてください。</p>

<p><strong>geta6：</strong>ブラウザ版のpixiv Sketchは、Node.js上で動かしています。</p>

<p><img src="/wp-content/uploads/2015/11/DSC08807.jpg" alt="" width="640" height="438" class="aligncenter size-full wp-image-17737" srcset="/wp-content/uploads/2015/11/DSC08807.jpg 640w, /wp-content/uploads/2015/11/DSC08807-300x205.jpg 300w, /wp-content/uploads/2015/11/DSC08807-207x142.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /><span style="font-size: 80%"><strong>　　▲ピクシブ株式会社　エンジニア　片倉弘貴さん</strong><br></span></p>

<p><strong>白石：</strong>Node.jsってことは、サーバーサイドから全然違うかんじなんでしょうか。</p>

<p><strong>geta6：</strong>サーバーサイドは、RailsによるAPIサーバーと、Node.jsによるレンダリングサーバーで構成されていて。前者はgrapeを使用していてviewを持たずJSONしか吐かない仕様になっていて、後者はサーバーサイドでAPIを叩いてDOMを構築するReactサーバーになっています。</p>

<p><strong>白石：</strong>なるほど。最近、Universal JavaScriptととも言われているIsomorphic Javascriptですね。それでサーバーサイドレンダリングしてるって、まさに最新ですね。</p>

<p><strong>geta6：</strong>フレームワークは、Yahooさんが作ったfluxibleというのを使っています。サーバーとクライアントが同じコードで動くので、キツイ面もありますけど。</p>

<p><strong>白石：</strong>fluxibleって、結構ヘビーだって聞きますね。</p>

<p><strong>geta6：</strong>fluxibleは一人でさくっと開発する場合とか、SPA（シングルページアプリケーション）とかには向いてないかもしれません。ただ、pixiv Sketchみたいに複数人数で開発する場合は、ある程度がっつりしたコードを書けるし、メンテナビリティがあるので魅力的です。</p>

<p>良いところは、二重実装をしなくていいことですね。テンプレートをslim側で書いて、Backbone.jsからもってきて、Javascriptテンプレート内にテキストテンプレートをもう一個書いて…とか面倒なことはしなくていい。同じコードベースでAPIのリクエストとかすべてのことができるので、そこが便利です。</p>

<p><strong>白石：</strong>サーバーとクライアントが同じコードで動くのがキツイと言ってましたが、具体的にはどんなところが大変なんですか？</p>

<p><strong>geta6：</strong>Reactは、クライアント側の世界とサーバー側の世界で、呼ばれるメソッドが違うところがあるんです。componentDidMountっていうメソッドなんですが、それはクライアント側にしか呼ばれないので、その中ではCanvasの操作やDOMの操作が書けるんです。それがわかっていればそんなにつらくないけど、React始めたばかりだと、その辺がわからないのでつらいのかもしれないです。</p>

<p><strong>白石：</strong>getaさんの勉強量は相当すごそうですね。</p>

<p><strong>geta6：</strong>いつもはそんなに勉強はしてないんですけど、pixiv Sketch始めるときに、Reactが流行ってるって聞いて、どうしてもやりたいって言ったら採用されたんです。React全然知らなかったのに、採用されたので一から徹底的に勉強しました(笑)。</p>

<p><img src="/wp-content/uploads/2015/11/DSC08863.jpg" alt="" width="640" height="406" class="aligncenter size-full wp-image-17744" srcset="/wp-content/uploads/2015/11/DSC08863.jpg 640w, /wp-content/uploads/2015/11/DSC08863-300x190.jpg 300w, /wp-content/uploads/2015/11/DSC08863-207x131.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>課題はパフォーマンス改善。野望はES6への乗り換え</h2>

<p><strong>白石：</strong>お二人が、今課題だと思ってることってありますか。</p>

<p><strong>川田：</strong>まだ入社したばかりなので、あまり深く掴めていませんが。自分の関わっているサービスのパフォーマンスが悪いことが気になっていますね。RailsとかJavaScriptとか、いろんなところに悪さするのが潜んでいますね。</p>

<p>もう一つは闇のコードたち。締め切り間際で、アドホックに作りこんじゃったコードとかがたくさんありまして。たとえば、BOOTHは「<a href="https://booth.pm/apollo/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">APOLLO(アポロ)</a>」という同人音楽をネット上で頒布する即売会イベントを開いていて、そういうイベント対応のために作りこまれて、めったに呼ばれないメンテされにくい闇のコードが眠っているんです。ある日とつぜん爆発しそうなので、なんとか阻止したいです。すでに若干、爆発しかけていますが…</p>

<p>こういう、サービス固有の問題みたいなのは山程ありますが、それ以外はとくに不安を感じてはいません。テストコードも書かれているし、最新のバージョンに上げていきましょうというモチベーションもある。機能追加や改善ばかりな企画屋さんがいるチームは世の中にいっぱいいるけど、うちはコードヘルスがサービスのライフサイクルやセキュリティにどんな影響を与えるのか理解されているし、バージョンアップしておかないと大変という感覚とか、エンジニアならわかる勘所を大事にしてくれています。上手くやれている感じがしています。</p>

<p><strong>白石：</strong>今後チャレンジしたいことはどうでしょう。</p>

<p><strong>川田：</strong>やっぱり、早くES6にしたいです。CoffeeScriptやめたい(笑)。</p>

<p><strong>白石：</strong>でも、CoffeeScriptのほうが言語的な機能は上じゃないですか？</p>

<p><strong>geta6：</strong>CoffeeScriptって1週間前に書いた自分のコードが読めなくなるんですよ。言語機能が強すぎて。特殊な記法が必要だし。ES6では普通に読めるから、メンテナンス性は高いですよね。</p>

<p><strong>川田：</strong>CoffeeScriptって、少し大きくなってくると、ビルドした結果を想像しながら書かなきゃいけなくなることがある。Devツールで、ちょっとこの値どうなってるんだろうとかコンソールを叩き始めると、今までCoffeeScriptのコードを読んでたはずなのに、完全にJavaScriptに戻ってたり。</p>

<p><strong>geta6：</strong>CoffeeScript書いてるより、JavaScript書いてるかんじが強いんですよね。インデントが効かないのも厳しい(笑)。</p>

<p><strong>川田：</strong>そうなんです。以前、私はTypeScriptを使っていたんですが、あれはビルドした結果がストレートに想像できるのがいい。あと、将来を見据えるとやっぱりES6を推しちゃいますね。</p>

<p><img src="/wp-content/uploads/2015/11/DSC08857.jpg" alt="" width="640" height="438" class="aligncenter size-full wp-image-17747" srcset="/wp-content/uploads/2015/11/DSC08857.jpg 640w, /wp-content/uploads/2015/11/DSC08857-300x205.jpg 300w, /wp-content/uploads/2015/11/DSC08857-207x142.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>Nodeのデプロイツールに定番がほしい</h2>

<p><strong>白石：</strong>getaさんはどうですか？</p>

<p><strong>geta6：</strong>開発環境の課題は、Node.jsのデプロイツールとプロセスマネージャーに定番がないことですね。デプロイは、信頼性をとってcapistranoを使ってるんですよ。Nodeのデプロイツールはどれも機能が貧弱で手数も多いので、定番でいいのが出てこないかなって思ってます。</p>

<p><strong>白石：</strong>プロセスマネージャーは何を使ってるんですか？</p>

<p><strong>geta6：</strong>プロセスマネージャーはPM2を使ってます。capistranoからシンボリックリンク設置して、currentで新しいファイルをディレクトリに送るんですが、Nodeのファイルシステムが変わってから、シンボリックリンクを追跡して、デプロイ前のファイルのところで監視しちゃうようになったんです。そこでプロセスマネージャーが生きちゃってるので、デプロイしてもファイルが新しくならないんです。そこで一回殺すというのをやってるので、ダウンタイムが若干できてしまうっていう問題点があります。</p>

<p><strong>白石：</strong>そういった課題の改善に取り組んでいるんですね。次にチャレンジしたいことはありますか？</p>

<p><strong>geta6：</strong>API側はバックエンドのプロセスマネージャーがUnicornなんですけど、ラインがN個しかなくて、同時に来ちゃったらつまっちゃうんです。Node側でいいかんじでリクエストをバッファリングしてうまく送れないかと。受付サーバーをNodeにしてゆっくり流すというようなことをしたいです。</p>

<p><strong>白石：</strong>なかなかエッジなプロジェクトになりそうですね。</p>

<p><img src="/wp-content/uploads/2015/11/DSC08859.jpg" alt="" width="640" height="394" class="aligncenter size-full wp-image-17749" srcset="/wp-content/uploads/2015/11/DSC08859.jpg 640w, /wp-content/uploads/2015/11/DSC08859-300x185.jpg 300w, /wp-content/uploads/2015/11/DSC08859-207x127.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><strong>geta6：</strong>requestIdleCallBackだっけ？あれも何かやってみたい。</p>

<p><strong>川田：</strong>ピクシブで「<a href="https://tokyo-web-perf.doorkeeper.jp/events/30701" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">東京 Web Performance</a>」という濃い勉強会をやったんですけど、エッジすぎて人が集まらないかなと思ったら、エッジな人が結構集まってきて(笑)。第一回は「requestIdleCallback」を味見したんですが、広告やアナリティクスに割といいかんじで使えそうだったんで、全力で攻めるんじゃないかって話をしてました。ピクシブに思いのほか、いい影響を及ぼしそうな予感がしてます。</p>

<p><strong>白石：</strong>じゃあ、そこも次のチャレンジになりそうですね。今日は面白いお話を聞かせていただき、ありがとうございました。</p>

<p><img src="/wp-content/uploads/2015/11/DSC08876.jpg" alt="" width="640" height="448" class="aligncenter size-full wp-image-17736" srcset="/wp-content/uploads/2015/11/DSC08876.jpg 640w, /wp-content/uploads/2015/11/DSC08876-300x210.jpg 300w, /wp-content/uploads/2015/11/DSC08876-207x145.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>
]]></content:encoded>
			</item>
		<item>
		<title>【HTML5 Experts.jp】2015年10月のブラウザ関連ニュース</title>
		<link>/myakura/17525/</link>
		<pubDate>Wed, 25 Nov 2015 00:00:52 +0000</pubDate>
		<dc:creator><![CDATA[矢倉 眞隆]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[ES6]]></category>
		<category><![CDATA[W3C]]></category>
		<category><![CDATA[WebKit]]></category>
		<category><![CDATA[ブラウザ]]></category>

		<guid isPermaLink="false">/?p=17525</guid>
		<description><![CDATA[連載： WEB標準化動向 (6)Safari 9.0リリース 10月1日にOS X 10.11 El Capitanがリリースされ、先月のiOS版に続きOS X版のSafariも9.0になりました。 Safari 9.0...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/webstandards-news/" class="series-156" title="WEB標準化動向" data-wpel-link="internal">WEB標準化動向</a> (6)</div><h2>Safari 9.0リリース</h2>

<p>10月1日にOS X 10.11 El Capitanがリリースされ、先月のiOS版に続きOS X版のSafariも9.0になりました。</p>

<p>Safari 9.0ではWeb Inspectorに力がはいったようで、UIの刷新ほか既存の機能もかなり強化されています。</p>

<ul>
<li><a href="https://www.webkit.org/blog/3574/web-inspector-interface-changes/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Web Inspector Interface Changes</a></li>
<li><a href="https://www.webkit.org/blog/3516/web-inspector-console-improvements/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Web Inspector Console Improvements</a></li>
<li><a href="https://www.webkit.org/blog/3961/styles-sidebar-refinements-in-web-inspector/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Styles Sidebar Refinements in Web Inspector</a></li>
<li><a href="https://www.webkit.org/blog/3846/type-profiling-and-code-coverage-profiling-for-javascript/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Type Profiling and Code Coverage Profiling for JavaScript</a></li>
<li><a href="https://www.webkit.org/blog/3996/introducing-the-rendering-frames-timeline/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Introducing the Rendering Frames Timeline</a></li>
</ul>

<p>いくつかの機能は他のブラウザに追いついたものですが、スタイルサイドバーのMatch StylesやJavaScriptの型プロファイルはユニークですね。</p>

<p>また、ES6実装状況についても簡単にまとめた記事が公開されています。</p>

<ul>
<li><a href="https://www.webkit.org/blog/4054/es6-in-webkit/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ES6 in WebKit</a></li>
</ul>

<p>ここ最近になりかなり実装が進んでいますが、Default parametersやArrow Functionsなどは次のメジャーバージョンになるようですね。</p>

<h2>Chrome 46リリース</h2>

<p>10月13日に<a href="http://googlechromereleases.blogspot.jp/2015/10/stable-channel-update.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Chrome 46がリリースされました</a>。新しく追加された機能などは<a href="http://blog.chromium.org/2015/09/chrome-46-beta-flexible-animations-and.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Chromium Blogのエントリ</a>…よりもChromiumベースなOperaのブログのほうが読みやすいです。</p>

<ul>
<li><a href="https://dev.opera.com/blog/opera-33/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Dev.Opera — Opera 33 released</a></li>
</ul>

<p><code>rel=preconnect</code> はCSSやスクリプトなどで他originのリソースを読み込む際にパフォーマンスを向上させられるかもしれません。詳しい説明や使い方は <code>preconnect</code> が定義されている <a href="https://w3c.github.io/resource-hints/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Resource Hints仕様</a>のEditorである<a href="https://www.igvita.com/2015/08/17/eliminating-roundtrips-with-preconnect/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Ilya Grigorikのエントリ</a>をお読みください。</p>

<h3>DevToolsのUI変更中</h3>

<p>そういえば、Chrome 45くらいからUIの変更を含め、DevToolsがいろいろ変わっています。こうした変更点について、Developer AdvocateのAddy Osmaniが行ったトークが公開されています。</p>

<ul>
<li><a href="https://www.youtube.com/watch?v=XpGa6IzmmQg" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Addy Osmani &#8211; What’s New in Chrome DevTools &#8211; YouTube</a></li>
</ul>

<p>また、先月発売された<a href="http://gihyo.jp/magazine/wdpress/archive/2015/vol89" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">WEB+DB PRESS 89号</a>でもエキスパートの<a href="https://html5experts.jp/ahomu/" data-wpel-link="internal">佐藤さん</a>と<a href="https://html5experts.jp/1000ch/" data-wpel-link="internal">泉水さん</a>によるChrome DevToolsの解説記事が掲載されています。すこし先の変更（Chrome 47 Canaryでの情報をもとに執筆）とのことで、現時点のChromeと若干違うかもしれませんが、大いに参考になりそうです。</p>

<h2>FirefoxがWebKit接頭辞つき機能のサポートを本格化</h2>

<p>FirefoxのNightlyで、WebKitの接頭辞つき機能がサポートされ始めました。<code>-webkit-linear-gradient</code>、<code>-webkit-radial-gradient</code>といったCSSのグラデーションを始め、<code>Element.webkitMatchesSelector()</code>メソッドなどDOM APIにの実装も行われています。</p>

<ul>
<li><a href="https://hg.mozilla.org/integration/mozilla-inbound/pushloghtml?changeset=a17eed123926" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">mozilla-inbound: pushlog ― Bug 1210575 &#8211; Add native support for parsing -webkit-linear-gradient &amp; -webkit-radial-gradient</a></li>
<li><a href="https://groups.google.com/forum/#!topic/mozilla.dev.platform/YXDTm13wZzI" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Intent to implement and ship: webkitMatchesSelector &#8211; Google Groups</a></li>
</ul>

<p>WebKit接頭辞なCSSのサポートですが、これまでは中国や日本の一部のサイトに限って有効にされていました。</p>

<ul>
<li><a href="http://myakura.hatenablog.com/entry/2015/04/24/211849" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">FirefoxのCSS Unprefixing Service &#8211; fragmentary</a></li>
</ul>

<p>ただ思った以上にWebKit接頭辞のみを仕様していることなどから、やむなく<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1177263" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">すべてのサイトで有効にするよう</a>です。</p>

<p>こうしたマッピングをベンダー独自にやってしまうことで、新たな互換性問題を生んでしまう可能性もあります。このためMozillaのCompatibility Teamが中心となり、互換性のためのドキュメント<a href="https://compat.spec.whatwg.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Compatibility Standard</a>の作業も始まっています。</p>

<p>また、<code>Element.webkitMatchesSelector()</code> についてはまとめやすさの都合からか、標準の <code>Element.matches()</code> エイリアスとして<a href="https://github.com/whatwg/dom/commit/9ac9c1548661a309c15168d71e6fb6af92d4d610" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">DOM仕様で定義されました</a>。ベンダー拡張だった機能の標準化はHTML、DOM、XMLHttpRequestなど多数の仕様で行われましたが、接頭辞つきの名前で仕様に定義されるのは、このメソッドが初めてかと思います。</p>

<p>なお、ベンダー接頭辞だけでなく、日本のWebが起こしている互換性の問題については、Compatibility TeamのKarl Dubostが以前に<a href="http://www.otsukare.info/2015/04/17/web-compatibility-japan" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">自身のブログに記しています</a>。彼は今月の<a href="http://www.mozilla.jp/events/devcon/2015/tokyo/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Firefox Developer Comference</a>でも登壇し、互換性の話をしました。とてもおもしろかったので、ビデオが公開されたらチェックしてくださいね。</p>
]]></content:encoded>
		
		<series:name><![CDATA[WEB標準化動向]]></series:name>
	</item>
	</channel>
</rss>
