<?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>Firebase &#8211; HTML5Experts.jp</title>
	<atom:link href="/tag/firebase/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>Firebaseで作る簡単リアルタイムウェブアプリケーション（前編 補）</title>
		<link>/technohippy/21196/</link>
		<pubDate>Tue, 18 Oct 2016 02:00:20 +0000</pubDate>
		<dc:creator><![CDATA[あんどう やすし]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[Firebase]]></category>

		<guid isPermaLink="false">/?p=21196</guid>
		<description><![CDATA[前回の記事は前編と称してFirebaseの機能を簡単に紹介しました。その続きである今回の記事は後編として何かアプリケーションを作りながら個々の機能を詳細に説明するはずでした。 しかし、前編からすでに10ヶ月が過ぎ、途中に...]]></description>
				<content:encoded><![CDATA[<p><a href="https://html5experts.jp/technohippy/18040/" target="_blank" data-wpel-link="internal">前回の記事</a>は前編と称してFirebaseの機能を簡単に紹介しました。その続きである今回の記事は後編として何かアプリケーションを作りながら個々の機能を詳細に説明するはずでした。<br>
しかし、前編からすでに10ヶ月が過ぎ、途中にGoogle I/Oを挟んだこともあって、すでに全体像が大幅に変更されています。そこで今回は「前編 補」として、いまさらではありますがGoogle I/O前後でFirebaseがどのように変わったのかをざっくりと説明します。</p>

<h2>新旧Firebaseの違い</h2>

<p>2016年5月のGoolge I/Oのキーノート、そしてそれに続く各セッションでFirebaseの大幅な拡張が発表されました。いったいどのような拡張が行われたのか、それはその発表前後のトップページの文言を比較すると分かりやすいでしょう。</p>

<table style="margin:10px;width:70%">
  <tr>
    <th style="text-align:center;font-weight:bold;background:#ffffcc">旧Firebase</th>
  </tr>
  <tr>
    <td style="text-align:center;margin:10px">
      <a href="https://html5experts.jp/wp-content/uploads/2016/01/3a345fd10f12d48416c28c3d696e92f2.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/01/3a345fd10f12d48416c28c3d696e92f2-300x219.png" alt="https://www.firebase.com/" width="300" height="219" class="size-medium wp-image-18079" srcset="/wp-content/uploads/2016/01/3a345fd10f12d48416c28c3d696e92f2-300x219.png 300w, /wp-content/uploads/2016/01/3a345fd10f12d48416c28c3d696e92f2.png 640w, /wp-content/uploads/2016/01/3a345fd10f12d48416c28c3d696e92f2-207x151.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a><br />
      <strong>素晴らしいアプリを開発</strong><br />
      モバイル／ウェブアプリのための強力なプラットフォーム
    </td>
  </tr>
</table>

<table style="margin:10px;width:70%">
  <tr>
    <th style="text-align:center;font-weight:bold;background:#ffffcc">新Firebase</th>
  </tr>
  <tr>
    <td style="text-align:center;margin:10px">
      <a href="https://html5experts.jp/wp-content/uploads/2016/10/d70d00af1a84922022b83aa54e5c82f1.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/10/d70d00af1a84922022b83aa54e5c82f1-300x247.png" width="300" height="247" class="alignnone size-medium wp-image-21199" srcset="/wp-content/uploads/2016/10/d70d00af1a84922022b83aa54e5c82f1-300x247.png 300w, /wp-content/uploads/2016/10/d70d00af1a84922022b83aa54e5c82f1.png 640w, /wp-content/uploads/2016/10/d70d00af1a84922022b83aa54e5c82f1-207x170.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a><br />
      <strong>アプリビジネス成功への近道</strong><br />
      質の高いアプリを作成し、ビジネスを成功に導く<br />ために必要なツールとインフラストラクチャ
    </td>
  </tr>
</table>

<p><br /></p>

<p>どうでしょう。新旧の立ち位置の違いが明確に表れていると思いませんか。</p>

<p>つまり、以前のFirebaseは単純にアプリのバックエンド開発／運用の省力化が目的でしたが、新しいFirebaseはアプリビジネスに関わるすべての領域をサポートして、その成功を目指すものになった、ということです。</p>

<h2>新しいFirebase</h2>

<p>新しいFirebaseの謳い文句は「アプリビジネス成功への近道」でした。それでは、Googleの考える「アプリビジネスの成功」とは何で、そのために拡張された機能にはどういうものがあるのでしょうか。これもFirebaseのトップページに分かりやすい説明があります。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/10/e702734ff6ac2845310894d93b5b3bd2.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/10/e702734ff6ac2845310894d93b5b3bd2-300x248.png" width="300" height="248" class="alignnone size-medium wp-image-21206" srcset="/wp-content/uploads/2016/10/e702734ff6ac2845310894d93b5b3bd2-300x248.png 300w, /wp-content/uploads/2016/10/e702734ff6ac2845310894d93b5b3bd2.png 640w, /wp-content/uploads/2016/10/e702734ff6ac2845310894d93b5b3bd2-207x171.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<p>この図から分かるようにGoogleはアプリ提供のプロセスをDevelop（開発）・Grow（拡大）・Earn（収益）の3つのステージで捉えています。さらに各ステージが繋がって輪になっていることから分かるように、この3ステージはアプリが生きている限り、オーバーラップしながら繰り返し現れてはずっと続いていくものです。</p>

<p>また、図をよく見ると3ステージから成る輪の中心にAnalytics（解析）があることが分かります。これらを考え合わせると、Googleが考えるアプリビジネスが成功している状態とは、<strong>Analyticsを軸にDevelop・Grow・Earnがスムーズに連携している状態</strong>であると理解することができます。</p>

<h2>Analyticsと3つのステージ</h2>

<p>全体像がわかったところで各ステージをサポートする機能を個別に見ていきましょう。なお、旧Firebaseにはなかった機能名は太字で記しています。</p>

<h3>Analytics</h3>

<p>先ほども書いたとおりAnalyticsは新しいFirebaseの核となる機能です。ここで得られる情報がDevelop・Grow・Earnすべてのステージを駆動します。</p>

<dl style="margin-left:20px">
  <dt><strong>Firebase Analytics</strong></dt>
  <dd style="text-indent:0;margin-left:20px">モバイルアプリのイベントログを記録します。初めての起動・アプリ内課金・アプリのバージョンアップなどのデフォルトで記録されるイベントの他、開発者が独自に定義したイベントの発生を記録し、Firebasコンソールで確認できます。対応する環境はiOSとAndroidです。</dd>
</dl>

<h3>Develop</h3>

<p>認証、ストレージ、テストなどアプリの開発に必要となる各種機能群です。</p>

<dl style="margin-left:20px">
  <dt><strong>Firebase Cloud Messaging</strong></dt>
  <dd style="text-indent:0;margin-left:20px">以前はGoogle Cloud Messagingと呼ばれていた機能です。対象のカテゴリを指定して通知を送信できます。対応する環境はiOS、Android、Webです。</dd>
  <dt>Firebase Authentication</dt>
  <dd style="text-indent:0;margin-left:20px">認証機能を提供します。FacebookやTwitterのアカウントを使用した認証、メールアドレスとパスワードを使用した認証などが利用できます。対応する環境はiOS、Android、Webです。</dd>
  <dt>Firebase Realtime Database</dt>
  <dd style="text-indent:0;margin-left:20px">サーバーと全クライアント間でデータが同期されるリアルタイムNoSQLデータベースです。<a href="https://html5experts.jp/technohippy/18040/" data-wpel-link="internal">前回</a>で説明したとおり、Firebaseで最も古い、サービスを特徴付ける機能です。対応する環境はiOS、Android、Webです。</dd>
  <dt><strong>Firebase Storage</strong></dt>
  <dd style="text-indent:0;margin-left:20px">Google Cloud Storageを内部的に使用するストレージサービスです。Firebase Realtime Databaseとは異なり、写真や動画などの静的なコンテンツを保存するのに適しています。対応する環境はiOS、Android、Webです。</dd>
  <dt>Firebase Hosting</dt>
  <dd style="text-indent:0;margin-left:20px">HTMLやJS、CSSなど静的なファイルのホスティングサービスです。Firebaseのコマンドラインツールを使用すれば、コマンドをひとつ実行するだけで簡単にウェブアプリをデプロイできます。対応する環境はもちろんWebだけです。</dd>
  <dt><strong>Firebase Remote Config</strong></dt>
  <dd style="text-indent:0;margin-left:20px">アプリの動作や外観をFirebaseコンソールから変更することができます。設定内容はOSの種類や国に応じて切り替えることができる他、例えばランダムに10%のユーザーにだけ特定の機能を有効にすることも可能です。対応する環境はiOSとAndroidです。</dd>
  <dt><strong>Firebase Test Lab for Android</strong></dt>
  <dd style="text-indent:0;margin-left:20px">Googleのデータセンター内の様々なAndroid端末上でテストを実行できます。テストの結果はログやスクリーンショットで確認できます。対応する環境は現在のところAndroidだけです。</dd>
  <dt><strong>Firebase Crash Reporting</strong></dt>
  <dd style="text-indent:0;margin-left:20px">iOS/Androidアプリのエラーを監視し、エラー発生時にはAnalyticsのイベントを発火し、情報を収集します。対応する環境はiOSとAndroidです。</dd>
</dl>

<h3>Grow</h3>

<p>公開後のアプリのユーザーベースの拡大に必要な機能群です。</p>

<dl style="margin-left:20px">
  <dt><strong>Firebase Notifications</strong></dt>
  <dd style="text-indent:0;margin-left:20px">FirebaseコンソールからグラフィカルなUIを通じてユーザーの端末に通知を送信できます。実際のメッセージの送信にはFirebase Cloud Messagingが利用されています。対応する環境はiOSとAndroidです。</dd>
  <dt><strong>Firebase App Indexing</strong></dt>
  <dd style="text-indent:0;margin-left:20px">以前はGoogle App Indexingと呼ばれていた機能です。Googleの検索結果にアプリを表示でき、直接アプリを起動できるようになります。対応する環境はiOSとAndroidです。</dd>
  <dt><strong>Firebase Dynamic Links</strong></dt>
  <dd style="text-indent:0;margin-left:20px">端末の種類は何か、アプリがインストールされているかどうか、アプリのユーザー登録は完了しているかどうか、などの条件に応じて適切に動作を変えるURLを生成できます。対応する環境はiOSとAndroidです。</dd>
  <dt><strong>Firebase Invites</strong></dt>
  <dd style="text-indent:0;margin-left:20px">Firebase Dynamic Linksを使用してユーザーにアプリの招待を送ることができます。対応する環境はiOSとAndroidです。</dd>
  <dt><strong>Google AdWords</strong></dt>
  <dd style="text-indent:0;margin-left:20px">Google AdWordsのアカウントをFirebaseプロジェクトにリンクし、アプリの利用状況に応じたターゲットユーザーを指定できるようになります。対応する環境はiOSとAndroidです。</dd>
</dl>

<h3>Earn</h3>

<p>アプリから収益を得るために必要な機能です。現時点で所属するAPIはAdMobしかないので、構成の都合で無理やり作ったステージの感じも若干あります。</p>

<dl style="margin-left:20px">
  <dt><strong>AdMob by Google</strong></dt>
  <dd style="text-indent:0;margin-left:20px">以前からあるモバイル広告プラットフォームですが、Firebaseプラットフォームの一員となったことでFirebase Analyticsを分析に利用できるようになりました。対応する環境はiOSとAndroidです。</dd>
</dl>

<h2>ウェブアプリ</h2>

<p>先のセクションでFirebaseで提供されている機能を一通り簡単に説明しました。太字の項目が多いことからも、旧Firebaseと比較して非常に多くの機能が追加されたことがわかると思います。しかし、ここでウェブ開発者な皆さん（html5experts.jpなので当然そうですよね？）にとって少し残念なお知らせがあります。気づかれた方もいるかもしれませんが、<strong>これら新機能の大部分はウェブアプリでは使えません</strong>。</p>

<p>説明のために各機能の対応プラットフォームと、ついでとして元となったサービスを表形式でまとめました。</p>

<table style="font-size:0.9em;margin:auto">
  <tr>
    <th style="text-align:center;font-weight:bold;background:#ffddcc">ステージ</th>
    <th style="text-align:center;font-weight:bold;background:#ffddcc">新Firebase</th>
    <th style="text-align:center;font-weight:bold;background:#ffddcc">旧Firebase</th>
    <th style="text-align:center;font-weight:bold;background:#ffddcc">Web</th>
    <th style="text-align:center;font-weight:bold;background:#ffddcc">iOS</th>
    <th style="text-align:center;font-weight:bold;background:#ffddcc">Android</th>
  </tr>
  <tr>
    <th style="vertical-align:middle;text-align:center;font-weight:bold;background:#ffddcc">Analytics</th>
    <td style="background:#ffffcc">Firebase Analytics</td>
    <td style="background:#eeeeee">&#8211;</td>
    <td style="text-align:center">&#8211;</td>
    <td style="text-align:center">o</td>
    <td style="text-align:center">o</td>
  </tr>
  <tr>
    <th style="vertical-align:middle;text-align:center;font-weight:bold;background:#ffddcc" rowspan="8">Develop</th>
    <td style="background:#ffffcc">Firebase Cloud Messaging</td>
    <td style="background:#eeeecc">Google Cloud Messaging</td>
    <td style="color:red;text-align:center">o</td>
    <td style="text-align:center">o</td>
    <td style="text-align:center">o</td>
  </tr>
  <tr>
    <td style="background:#ffffcc">Firebase Authentication</td>
    <td style="background:#ffffcc">Firebase Authentication</td>
    <td style="color:red;text-align:center">o</td>
    <td style="text-align:center">o</td>
    <td style="text-align:center">o</td>
  </tr>
  <tr>
    <td style="background:#ffffcc">Firebase Realtime Database</td>
    <td style="background:#ffffcc">Firebase Realtime Database</td>
    <td style="color:red;text-align:center">o</td>
    <td style="text-align:center">o</td>
    <td style="text-align:center">o</td>
  </tr>
  <tr>
    <td style="background:#ffffcc">Firebase Storage</td>
    <td style="background:#eeeecc">(Google Cloud Storage)</td>
    <td style="color:red;text-align:center">o</td>
    <td style="text-align:center">o</td>
    <td style="text-align:center">o</td>
  </tr>
  <tr>
    <td style="background:#ffffcc">Firebase Hosting</td>
    <td style="background:#ffffcc">Firebase Hosting</td>
    <td style="color:red;text-align:center">o</td>
    <td style="text-align:center">&#8211;</td>
    <td style="text-align:center">&#8211;</td>
  </tr>
  <tr>
    <td style="background:#ffffcc">Firebase Remote Config</td>
    <td style="background:#eeeeee">&#8211;</td>
    <td style="text-align:center">&#8211;</td>
    <td style="text-align:center">o</td>
    <td style="text-align:center">o</td>
  </tr>
  <tr>
    <td style="background:#ffffcc">Firebase Test Lab for Android</td>
    <td style="background:#eeeecc">Cloud Test Lab for Android</td>
    <td style="text-align:center">&#8211;</td>
    <td style="text-align:center">&#8211;</td>
    <td style="text-align:center">o</td>
  </tr>
  <tr>
    <td style="background:#ffffcc">Firebase Crash Report</td>
    <td style="background:#eeeeee">&#8211;</td>
    <td style="text-align:center">&#8211;</td>
    <td style="text-align:center">o</td>
    <td style="text-align:center">o</td>
  </tr>
  <tr>
    <th style="vertical-align:middle;text-align:center;font-weight:bold;background:#ffddcc" rowspan="5">Grow</th>
    <td style="background:#ffffcc">Firebase Notifications</td>
    <td style="background:#eeeeee">&#8211;</td>
    <td style="text-align:center">&#8211;</td>
    <td style="text-align:center">o</td>
    <td style="text-align:center">o</td>
  </tr>
  <tr>
    <td style="background:#ffffcc">Firebase App Indexing</td>
    <td style="background:#eeeecc">Google App Indexing</td>
    <td style="text-align:center">&#8211;</td>
    <td style="text-align:center">o</td>
    <td style="text-align:center">o</td>
  </tr>
  <tr>
    <td style="background:#ffffcc">Firebase Dynamic Links</td>
    <td style="background:#eeeeee">&#8211;</td>
    <td style="text-align:center">&#8211;</td>
    <td style="text-align:center">o</td>
    <td style="text-align:center">o</td>
  </tr>
  <tr>
    <td style="background:#ffffcc">Firebase Invites</td>
    <td style="background:#eeeeee">&#8211;</td>
    <td style="text-align:center">&#8211;</td>
    <td style="text-align:center">o</td>
    <td style="text-align:center">o</td>
  </tr>
  <tr>
    <td style="background:#ffffcc">Google AdWords</td>
    <td style="background:#eeeecc">Google AdWords</td>
    <td style="text-align:center">&#8211;</td>
    <td style="text-align:center">o</td>
    <td style="text-align:center">o</td>
  </tr>
  <tr>
    <th style="vertical-align:middle;text-align:center;font-weight:bold;background:#ffddcc" rowspan="1">Earn</th>
    <td style="background:#ffffcc">AdMob</td>
    <td style="background:#eeeecc">AdMob</td>
    <td style="text-align:center">&#8211;</td>
    <td style="text-align:center">o</td>
    <td style="text-align:center">o</td>
  </tr>
</table>

<p><br /></p>

<p>いつからかFirebaseの機能が大幅に拡張されたかのように錯覚していましたが、表を見るとWeb版に関しては旧来のFirebaseと比較してできることにほぼ差がないということが一目瞭然です。Develop、Grow、EarnがAnalyticsを中心に連携するのが新Firebaseの基本理念だったはずですが、Webに関して言えばDevelopしかありません。大丈夫なんでしょうか。</p>

<p>そしてそのDevelopについても、2つの違いのうちのひとつであるFirebase Cloud MessagingについてはGoogle Cloud Messagingから名前が変わっただけで、結局新旧の違いらしい違いといえばFirebase Storageにより静的なファイルが扱いやすくなったことくらいです。</p>

<p>従って、ウェブ開発者の視点では新旧の違いは機能面からではなく、「GoogleがFirebaseに対して本気になっている」という<strong>精神面での向上</strong>として捉えるのが正解でしょう。実際Firebaseドキュメント日本語化の状況や、公式ブログでのFirebaseの露出も以前とは段違いですので、<a href="http://blog.parse.com/announcements/moving-on/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">FacebookのParse.comに対する仕打ち</a>のようなものを心配する必要が直近ではなくなったと考えられるのはウェブ開発者としても非常に喜ばしいことです。</p>

<h2>機能面以外の変更</h2>

<p>これまで機能面（と精神面）での変更点について紹介してきましたが、最後にそれら以外の変更点についても簡単に触れておきます。</p>

<h3>FirebaseコンソールのUI</h3>

<p>機能が追加されるに当たって、当然ですがそれらを管理するFirebaseコンソールのUIも変更されています。しかし見た目の変更を除けば、既存機能に関しては左側のナビゲーションに表示される項目が増えただけですので、それほど気にする必要はありません。</p>

<p>ただし、以前のFirebaseで作成したプロジェクトを新しいFirebaseコンソールで管理するには明示的にコンソールをアップグレードし、さらにデータベースの情報をインポートする必要があります。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/10/5cf5bb3b65daca9205a8ddff2775f20c.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/10/5cf5bb3b65daca9205a8ddff2775f20c-300x238.png" alt="データインポート" width="300" height="238" class="alignnone size-medium wp-image-21343" srcset="/wp-content/uploads/2016/10/5cf5bb3b65daca9205a8ddff2775f20c-300x238.png 300w, /wp-content/uploads/2016/10/5cf5bb3b65daca9205a8ddff2775f20c.png 640w, /wp-content/uploads/2016/10/5cf5bb3b65daca9205a8ddff2775f20c-207x164.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<h3>料金体系</h3>

<p><a href="https://firebase.google.com/pricing/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">料金体系</a>が大幅に変更されました。元々はFreeプランを含めてクォータの違いごとに6種類あったものが、現在はフリープラン（SPARK）・月額固定制有料プラン（FLAME）・従量制有料プラン（BLAZE）の3種類にまとめられました。</p>

<p>これまでフリープランを使用してた人にとっては、クォータはほぼ変更がないまま、以前は無料では利用できなかった独自ドメインを設定できるようになったということで喜ばしい変更でしょう。</p>

<h3>サポート言語の追加</h3>

<p>あくまでも実験的にですが<a href="https://firebase.google.com/docs/cpp/setup" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">C++ SDK</a>が追加されています。モバイルゲームなどパフォーマンスが要求されるアプリでは利用を検討してみてもいいでしょう。</p>

<h2>まとめ</h2>

<p>身もふたもない言い方をすれば、新しいFirebaseは「これまでGoogleが個別に提供していたアプリ提供者向けサービスを上流から下流までほぼ全て集約した統一ブランドの名前」になりました。</p>

<p>本連載に限っての結論としては「以前とほぼ変わっていない」という理解で構いません。UIの変更はもちろんありますが、できることは変わっていないので取り急ぎは安心して<a href="https://html5experts.jp/technohippy/18040/" target="_blank" data-wpel-link="internal">前回の記事</a>を参考にして頂ければと思います。</p>

<p>ということで次回こそ、Firebaseで何かを作りながらより詳細に機能を紹介します。</p>
]]></content:encoded>
			</item>
		<item>
		<title>Firebaseで楽々シグナリング──WebRTC入門2016番外編</title>
		<link>/mganeko/20273/</link>
		<pubDate>Wed, 31 Aug 2016 00:00:42 +0000</pubDate>
		<dc:creator><![CDATA[がねこまさし]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Firebase]]></category>
		<category><![CDATA[WebRTC]]></category>

		<guid isPermaLink="false">/?p=20273</guid>
		<description><![CDATA[連載： WebRTC入門2016 (5)こんにちは！ 2014年に連載した「WebRTCを使ってみよう！」シリーズのアップデートとしてお送りしているこの連載ですが、今回はもとの連載にはなかった内容を番外編としてお届けしま...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/webrtc2016/" class="series-380" title="WebRTC入門2016" data-wpel-link="internal">WebRTC入門2016</a> (5)</div><p>こんにちは！ 2014年に連載した<a href="https://html5experts.jp/series/webrtc-beginner/" target="_blank" data-wpel-link="internal">「WebRTCを使ってみよう！」</a>シリーズのアップデートとしてお送りしている<a href="https://html5experts.jp/series/webrtc2016/" target="_blank" data-wpel-link="internal">この連載</a>ですが、今回はもとの連載にはなかった内容を番外編としてお届けします。</p>

<h2>httpsのハードル</h2>

<p><a href="https://html5experts.jp/mganeko/20112/" target="_blank" data-wpel-link="internal">前回は複数人、複数会議室</a>で利用できるようにして、実用的なアプリを作る準備ができました。ところが実際に使おうとすると、Chromeのセキュリティポリシーと向き合わなくてはなりません。</p>

<p>「getUserMedia()やService Workerなどの強力なAPIは、セキュアな環境でなくては利用できない」というポリシーは今のWebの状況に合わせたものだと思います。では、その環境をどうやって用意すればよいのでしょうか？</p>

<p>もちろん証明書を取得して、きちんとサーバーを立てるのがまっとうなやり方です。最近はLet&#8217;s Encryptなど無料で証明書を発行するサービスもあります（参考：<a href="https://webrtchacks.com/lets-encrypt/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">&#8220;Let’s Encrypt – how get to free SSL for WebRTC&#8221;</a>）。とはいえ、試験的な利用でそこまで準備するのは大変というのも、正直なところです。そこで今回は、比較的とっつきやすい方法をご紹介します。</p>

<h3>Webサーバー</h3>

<p>HTMLやJavaScriptなどの静的コンテンツを配置できる手段はいくつかあります。エンジニアの皆さんであれば、次の2つをすでに利用されている方々も多いのではないでしょうか？</p>

<ul>
<li>GitHub Pages</li>
<li>Google App Engine</li>
</ul>

<p>どちらも http / https の両方でアクセスできますし、独自ドメインで利用することも可能です。（※利用方法についてはWebに多くの情報がありますので、そちらをご参照ください）</p>

<p>また、シグナリングで利用するFirebaseにも静的コンテンツのホスティング機能があります。</p>

<h3>シグナリングサーバー</h3>

<p>シグナリングにはsocket.ioなど、WebSocketを活用した仕組みが使われる例が多いようです。もちろん他の方法（例えば手動シグナリング）でもいいのですが、サーバーとクライアント（ブラウザ）で双方向に通信するにはWebSocketが適切なのでしょう。</p>

<p>https://～から取得されたHTML/JavaScriptからWebSocketサーバーに接続する場合には、そちらもセキュアでなくてはなりません。(ws://～ではなく、wss://～）。WebSocketを利用したシグナリングサーバーを自分で用意する場合、そちらでも証明書が必要になります。</p>

<p>そこで今回はリアルタイムメッセージングに利用できるBaaSである<a href="https://www.firebase.com/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Firebase</a>を使って、シグナリングの仕組みを構築したいと思います。</p>

<h2>Firebaseでシグナリングを実現するには</h2>

<p>まずはFirebaseにサインアップし、必要なキーやURLを入手しましょう。</p>

<ul>
<li>参考：<a href="https://html5experts.jp/technohippy/18040/" target="_blank" data-wpel-link="internal">Firebaseで作る簡単リアルタイムウェブアプリケーション </a></li>
</ul>

<p>（※手順については今回は省略させていただきます。あしらかず）</p>

<p>ブラウザでFirebaseの機能を利用するために、必要なライブラリを読み込んでおきます。今回はデータベースを利用するので、必要なjsファイルは次の通りとなります。</p>

<p></p><pre class="crayon-plain-tag">&lt;script src="https://www.gstatic.com/firebasejs/3.1.0/firebase-app.js"&gt;&lt;/script&gt;
 &lt;script src="https://www.gstatic.com/firebasejs/3.1.0/firebase-database.js"&gt;&lt;/script&gt;</pre><p></p>

<p>それから取得しておいたキーとURLを用いてFirebaseに接続します。
</p><pre class="crayon-plain-tag">// Initialize Firebase
  let config = {
    apiKey: "yourAPIKey",  // &lt;-- please set your API key
    databaseURL: "https://yourapp.firebaseio.com/",  // &lt;-- please set your database URL
  };
  firebase.initializeApp(config);
  let database = firebase.database();</pre><p></p>

<h3>シグナリングで送りたいモノ</h3>

<p>前回の記事にもあるように、シグナリングでは2つの通信ケースがあります。</p>

<ul>
<li>ルーム内の他のメンバー全員（接続している他のクライアントすべて）に送る</li>
<li>特定のメンバー（特定のクライアント）だけに送る</li>
</ul>

<p>また後者のためには、特定のメンバーを識別するための何らかのIDが必要となります。</p>

<ul>
<li>クライアント側で、重ならない/重なりにくい ようにIDを決める（UUID、タイムスタンプ、乱数など）</li>
<li>サーバー側でIDを振り出す</li>
</ul>

<p>Firebaseを使うとデータベースに格納されるオブジェクトのすべてにIDが振られるので、今回はそれを利用します。</p>

<h3>データベースの構造</h3>

<p>Firebaseはデータベースによる階層構造をもったデータの永続化と、その追加/変更/削除のイベント通知が行えます。今回は次のようなアプリ/ルーム/メンバーの階層構造としました。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/08/firebase_structure_11.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/08/firebase_structure_11-300x218.png" alt="firebase_structure_1" width="300" height="218" class="alignnone size-medium wp-image-20292" srcset="/wp-content/uploads/2016/08/firebase_structure_11-300x218.png 300w, /wp-content/uploads/2016/08/firebase_structure_11.png 640w, /wp-content/uploads/2016/08/firebase_structure_11-207x151.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<p>例えばルーム&#8221;test&#8221;にメンバー&#8221;bbb&#8221;が参加する場合、次の2カ所のイベントを待ち受けています。</p>

<ul>
<li>multi/room_test/&#95;broadcast&#95; の child_added イベント</li>
<li>multi/room_test/&#95;direct&#95;/member_bbb の child_added イベント</li>
</ul>

<p>また、multi/room_test/&#95;join&#95; はメッセージのやりとり以外の用途で使います。</p>

<h3>メンバーのIDの決定</h3>

<p>メンバーを特定してメッセージを送るには、メンバーを識別するIDが必要です。先ほどは仮に&#8221;bbb&#8221;としましたが、実際には衝突を避けるためにFirebase側で振り出されるキーを利用することにしました。</p>

<p></p><pre class="crayon-plain-tag">let databaseRoot = 'myapp/multi/';
    let key = database.ref(databaseRoot + room + '/_join_').push({ joined : 'unknown'}).key
    clientId = 'member_' + key;
    database.ref(databaseRoot + room + '/_join_/' + key).update({ joined : clientId});</pre><p></p>

<p>データベースにパスを指定してpush()すると、子要素が追加されて、そのキーが返っています。その値を使って先ほどの子要素の内容を更新しています。</p>

<p>ここまで終わった時のDatabaseの内容をFirebaseのコンソールで見てみると、次のようになっています。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/08/firebase_join.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/08/firebase_join-300x182.png" alt="firebase_join" width="300" height="182" class="alignnone size-medium wp-image-20299" srcset="/wp-content/uploads/2016/08/firebase_join-300x182.png 300w, /wp-content/uploads/2016/08/firebase_join.png 640w, /wp-content/uploads/2016/08/firebase_join-207x125.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<h3>ルーム内へのブロードキャスト</h3>

<p>シグナリングの流れは<a href="https://html5experts.jp/mganeko/20112/" target="_blank" data-wpel-link="internal">前回と同じ</a>です。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/07/multi_callme_simple.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/07/multi_callme_simple-300x225.png" alt="multi_callme_simple" width="300" height="225" class="alignnone size-medium wp-image-20140" srcset="/wp-content/uploads/2016/07/multi_callme_simple-300x225.png 300w, /wp-content/uploads/2016/07/multi_callme_simple.png 640w, /wp-content/uploads/2016/07/multi_callme_simple-207x155.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<ul>
<li>新たに通信を開始したい人（member_xxxx）が、通信開始の合図のルーム内にブロードキャスする(“call me”）</li>
</ul>

<p>&#8220;test&#8221;ルームにブロードキャストする場合には、 multi/room_test/&#95;broadcast&#95; の下を使います。</p>

<p></p><pre class="crayon-plain-tag">let roomBroadcastRef = database.ref(databaseRoot + room + '/_broadcast_');

  // 通信開始の合図
  function callMe() {
    emitRoom({type: 'call me'});
  }

  function emitRoom(msg) {
    msg.from = clientId; // メッセージに送信元（自分のID)をセット
    roomBroadcastRef.push(msg);
  }</pre><p></p>

<p>各メンバーはこのブロードキャストのイベントを待ち受けていて、typeに応じて処理を行います。</p>

<p></p><pre class="crayon-plain-tag">roomBroadcastRef.on('child_added', function(data) {
      let message = data.val();
      let fromId = message.from;
      if (fromId === clientId) {
        // ignore self message (自分自身からのメッセージは無視する）
        return;
      }
      
      if (message.type === 'call me') {
        // 接続処理
      }
    });</pre><p></p>

<p>socket.ioでは自分自身からメッセージは飛んで来ませんが、Firebaseでは自分でpush()してもイベントが飛んでくるので、それは無視しています。</p>

<h3>特定のメンバーへのメッセージ</h3>

<p>通信開始の合図である&#8221;call me&#8221;以外は、特定のメンバー宛のメッセージのやり取りになります。例えば member_bbb 宛のメッセージは、この下にpush()します。</p>

<ul>
<li>multi/room_test/<em>direct</em>/member_bbb</li>
</ul>

<p></p><pre class="crayon-plain-tag">function emitTo(id, msg) {
    msg.from = clientId; // メッセージに送信元（自分のID)をセット
    database.ref(databaseRoot + room + '/_direct_/' + id).push(msg);
  }</pre><p></p>

<p>Offer/Answerの交換やICE Candidateのやり取りは、すべてこちらのメンバー宛のメッセージになります。</p>

<h3>Firebaseのルール設定</h3>

<p>Firebaseのデータベースにはアクセスのルール指定があります。デフィルトではread/writeにAuth必要なルールが生成されていますが、今回のサンプルでは特定のパス以下はAuth不要で読み書きできるよう、ルールを追加しました。</p>

<p></p><pre class="crayon-plain-tag">{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null",
    "myapp" : {
      "multi" : {
        ".read": true,
        ".write": true
      }
    }
  }
}</pre><p></p>

<h2>NAT越えの設定 STUNの設定</h2>

<p>せっかくFirebaseでメッセージをやり取りできるので、NATを超えてWebRTCで通信できるようにしましょう。</p>

<p>NATを超えて通信を行うには、ローカルネットワークでのIPアドレスではなく、グローバルIPを伝える必要があります。今回は詳しく説明しませんが、そのための仕組みがSTUNです。GoogleがSTUNサーバーを公開しているので、それを使わせてもらいましょう。</p>

<p></p><pre class="crayon-plain-tag">function prepareNewConnection(id) {
    let pc_config = {"iceServers":[{"urls": "stun:stun.l.google.com:19302"}]}; // for STUN server
    let peer = new RTCPeerConnection(pc_config);
    // ... 省略 ...
  }</pre><p></p>

<p>※ <a href="https://html5experts.jp/mganeko/5554/" target="_blank" data-wpel-link="internal">2014年の記事</a>では&#8221;url&#8221; と指定していましたが、現在の仕様では&#8221;urls&#8221;と指定する必要があります。</p>

<p>このようにSTUNサーバーを指定することで、通信経路の候補(ICE Candidate)に、STUN経由で取得した情報も含まれるようになります。</p>

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

<p>今回のサンプルをGitHub Pagesで公開しています。Firebaseもしばらく(〜2016年9月末の予定）使える状態にしておきますので、皆さんもお試しください。</p>

<ul>
<li>GitHub Pages で試す <a href="https://mganeko.github.io/webrtcexpjp/basic2016/multi_firebase.html" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">multi_firebase.html</a> (Chrome/Firefox）</li>
<li>GitHub でソースを見る <a href="https://github.com/mganeko/webrtcexpjp/blob/master/basic2016/multi_firebase.html" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">multi_firebase.html</a> </li>
</ul>

<p>※シグナリングの手段以外は、<a href="https://html5experts.jp/mganeko/20112/" target="_blank" data-wpel-link="internal">前回のソース</a>と同様の処理になっています。</p>

<h3>使い方</h3>

<ul>
<li>URLの後ろに ?<em>room</em> という形で、好きなルーム名を指定してください

<ul>
<li>https://mganeko.github.io/webrtcexpjp/basic2016/multi_firebase.html?<em>お好きなルーム名</em></li>
</ul></li>
<li>ルーム名を指定せずに multi_firebase.html を開くと、ランダムにルーム名を決定します</li>
<li>[Start Video]をクリックし、カメラの映像とマイクの音声を取得します</li>
<li>通信相手にも同じルーム名を指定してブラウザ(Chrome/Firebox)でアクセスしてもらいます

<ul>
<li>?<em>room</em> も含むURLを伝えてください</li>
<li>&#8220;Mail link of this room&#8221; をクリックすると、URLを送るためのメーラーが開きます。宛先を指定して送信してください</li>
</ul></li>
<li>通信相手にも[Start Video]をクリックし、カメラの映像とマイクの音声を取得してもらいます</li>
<li>自分、あるいは相手から[Connect]ボタンを押してください</li>
<li>Firebase経由で情報が交換され、P2P通信が始まります</li>
<li>このサンプルでは、同じルームに同時に4人まで(3人の相手と)通信することができます</li>
</ul>

<h3>トラブルシューティング</h3>

<ul>
<li>異なるPCで通信できない場合

<ul>
<li>→ ルーム名が一致しているか確認していください</li>
<li>ルーム名を指定せずにブラウザでアクセスすると、ランダムにルーム名が決定されます</li>
<li>異なるPCでは、それぞれ異なるルーム名がランダムに決定されます</li>
</ul></li>
<li>一度接続できたが、その後できなくなった場合

<ul>
<li>ルーム内の過去のブロードキャストメッセージが残っている可能性があります</li>
<li>ルーム名を変更して、再度接続してみてください</li>
</ul></li>
<li>（例えば）会社と自宅で通信できない場合

<ul>
<li>→ NATだけでなく、FirewallでUDP通信やポートが制限されている可能性があります</li>
<li>※Firewallを超えての通信については、次回の記事で取り上げる予定です</li>
</ul></li>
</ul>

<h3>Edge同士での通信</h3>

<p>webrtc.orgが提供している<a href="https://github.com/webrtc/adapter" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">adapter.js</a>を使うと、多くのブラウザの差異を吸収することができます。最新の<a href="https://webrtc.github.io/adapter/adapter-latest.js" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">https://webrtc.github.io/adapter/adapter-latest.js</a>を読み込めば、Microsoft EdgeのサポートしてるORTCを、WebRTCのオブジェクトのインターフェイスを通して利用することができます。</p>

<p>残念ながらサポートしているビデオコーデックの制限で、ChromeやFirefoxとのビデオ通信はできませんが、Edge同士であれば今回のFirebaseを使ったシグナリングでビデオ/オーディオのP2P通信を行うことができます。</p>

<ul>
<li>GitHub Pages で試す <a href="https://mganeko.github.io/webrtcexpjp/basic2016/multi_firebase_adapter.html" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">multi_firebase_adapter.html</a> (Chrome/Firefox）</li>
<li>GitHub でソースを見る <a href="https://github.com/mganeko/webrtcexpjp/blob/master/basic2016/multi_firebase_adapter.html" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">multi_firebase_adapter.html</a> </li>
</ul>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/08/edge_firebase.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/08/edge_firebase-300x135.png" alt="edge_firebase" width="300" height="135" class="alignnone size-medium wp-image-20323" srcset="/wp-content/uploads/2016/08/edge_firebase-300x135.png 300w, /wp-content/uploads/2016/08/edge_firebase.png 640w, /wp-content/uploads/2016/08/edge_firebase-207x93.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<h4>注意点</h4>

<ul>
<li>Edgeでは、同一のカメラを複数のウィンドウ/タブで利用することができません。同一PCで通信する場合は、複数のカメラを用意してください</li>
<li>Edgeでは現在のところSTUNはサポートされていない(TURNのみサポート)ため、今回のサンプルでNATを越えた通信はできません</li>
</ul>

<h2>次回は</h2>

<p>今回はFirebaseを使ってシグナリングを実現しました。次回はNAT/Firewallを超えてのWebRTC通信についてお届けする予定です。</p>
]]></content:encoded>
		
		<series:name><![CDATA[WebRTC入門2016]]></series:name>
	</item>
		<item>
		<title>Google Assistant、Android N、Daydream、Firebase…Google I/O 基調講演で発表された最新機能を一挙紹介！</title>
		<link>/sakkuru/19832/</link>
		<pubDate>Wed, 06 Jul 2016 02:04:12 +0000</pubDate>
		<dc:creator><![CDATA[本間 咲来]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Firebase]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[I/0 2016]]></category>

		<guid isPermaLink="false">/?p=19832</guid>
		<description><![CDATA[2016年5月18～20日の3日間、Googleの本社ビルのすぐそばにあるショアライン・アンフィシアターでGoogle I/O 2016が開催されました。 例年5千名程の参加者から大幅に増えて、今年は実に約7千人の人々が...]]></description>
				<content:encoded><![CDATA[<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/1706738f-6ac5-6eb3-6ac1-58f6139496ea.jpeg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/1706738f-6ac5-6eb3-6ac1-58f6139496ea-640x480.jpeg" alt="1706738f-6ac5-6eb3-6ac1-58f6139496ea" width="640" height="480" class="alignnone size-large wp-image-19883" srcset="/wp-content/uploads/2016/06/1706738f-6ac5-6eb3-6ac1-58f6139496ea.jpeg 640w, /wp-content/uploads/2016/06/1706738f-6ac5-6eb3-6ac1-58f6139496ea-300x225.jpeg 300w, /wp-content/uploads/2016/06/1706738f-6ac5-6eb3-6ac1-58f6139496ea-207x155.jpeg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>2016年5月18～20日の3日間、Googleの本社ビルのすぐそばにあるショアライン・アンフィシアターでGoogle I/O 2016が開催されました。</p>

<p>例年5千名程の参加者から大幅に増えて、今年は実に約7千人の人々が参加していたようです。屋外イベント施設ということもあり、まるで野外フェスのような雰囲気でした。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/ca24a108-32c6-a0a8-8ada-9b041e73fb51.jpeg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/ca24a108-32c6-a0a8-8ada-9b041e73fb51-640x215.jpeg" alt="ca24a108-32c6-a0a8-8ada-9b041e73fb51" width="640" height="215" class="alignnone size-large wp-image-19884" srcset="/wp-content/uploads/2016/06/ca24a108-32c6-a0a8-8ada-9b041e73fb51.jpeg 640w, /wp-content/uploads/2016/06/ca24a108-32c6-a0a8-8ada-9b041e73fb51-300x101.jpeg 300w, /wp-content/uploads/2016/06/ca24a108-32c6-a0a8-8ada-9b041e73fb51-207x70.jpeg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>本レポートではGoogle I/O最初のセッションである、基調講演の内容について紹介します。</p>

<h2>Google Assistant</h2>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/4e8f5657-c3d5-2a6f-e88e-4697c0419a44.jpeg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/4e8f5657-c3d5-2a6f-e88e-4697c0419a44-640x480.jpeg" alt="4e8f5657-c3d5-2a6f-e88e-4697c0419a44" width="640" height="480" class="alignnone size-large wp-image-19880" srcset="/wp-content/uploads/2016/06/4e8f5657-c3d5-2a6f-e88e-4697c0419a44.jpeg 640w, /wp-content/uploads/2016/06/4e8f5657-c3d5-2a6f-e88e-4697c0419a44-300x225.jpeg 300w, /wp-content/uploads/2016/06/4e8f5657-c3d5-2a6f-e88e-4697c0419a44-207x155.jpeg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>まず最初にスンダー・ピチャイ氏に紹介されたのが、Google Assistantです。</p>

<p>Google Assistantは新しい対話型のボイスアシスタント機能です。Google製のアシスタント機能といえばGoogle Nowがありますが、これを進化させ、対話型のシステムとしたのがGoogle Assistantのようです。コンテキストを認識し、ユーザーが質問すると現在地や直近のクエリーなどに応じて、適切に答えを返します。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/IMG_6458.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/IMG_6458-640x480.jpg" alt="IMG_6458" width="640" height="480" class="alignnone size-large wp-image-19908" srcset="/wp-content/uploads/2016/06/IMG_6458.jpg 640w, /wp-content/uploads/2016/06/IMG_6458-300x225.jpg 300w, /wp-content/uploads/2016/06/IMG_6458-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>例えば、有名な建築物の前で「これを設計したのは誰？」と質問すると、その場所の情報に応じて回答してくれます。</p>

<p>デモでは、ユーザーが「今夜やってる映画は？」と聞くと、Google Assistantは近くの映画館で上映しているタイトルをいくつか提示し、さらにユーザーが「子どもと一緒に行きたい」と言うと、子どもと一緒に鑑賞するのにふさわしいと思われる映画を提案していました。さらに「4枚チケットが必要ですか？」とGoogle Assistantが尋ねてくるので、ユーザが映画のタイトルや枚数を答えると、自動で予約し、チケットの情報を提示する、というデモが行われました。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.07.57.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.07.57-640x437.png" alt="Screen Shot 2016-06-28 at 19.07.57" width="640" height="437" class="alignnone size-large wp-image-19903" srcset="/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.07.57.png 640w, /wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.07.57-300x205.png 300w, /wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.07.57-207x141.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>このように、『提案をしてくれる』というのがGoogle Assistantの大きな特徴です。Google Assistantは基調講演の中で発表されたGoogle HomeやGoogle Alloなどの製品にも組み込まれるようです。</p>

<h2>Google Home</h2>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/2e4a891d-0d45-9b7c-447a-7cff49acf55b.jpeg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/2e4a891d-0d45-9b7c-447a-7cff49acf55b-640x480.jpeg" alt="2e4a891d-0d45-9b7c-447a-7cff49acf55b" width="640" height="480" class="alignnone size-large wp-image-19879" srcset="/wp-content/uploads/2016/06/2e4a891d-0d45-9b7c-447a-7cff49acf55b.jpeg 640w, /wp-content/uploads/2016/06/2e4a891d-0d45-9b7c-447a-7cff49acf55b-300x225.jpeg 300w, /wp-content/uploads/2016/06/2e4a891d-0d45-9b7c-447a-7cff49acf55b-207x155.jpeg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>続いてGoogle Assistantの機能を組み込んだGoogle Homeという製品が紹介されました。</p>

<p>Google Assistantのボイスアシスタント機能の他にWifiスピーカーとしての機能もあり、クラウドから音楽のストリーミング再生もできるようです。プレイリストやアルバムへのアクセスもボイスコントロールでき、Google Castを通して、AndroidやiOSのデバイスから音楽を送信することもできるとのことでした。</p>

<p>Amazon Echoと似たような製品のようです。大きさは手のひらに乗るくらいの小さなデバイスでした。今年の後半から使えるようになるとのことです。</p>

<h2>Google Allo</h2>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-18.44.37.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-18.44.37-640x364.png" alt="Screen Shot 2016-06-28 at 18.44.37" width="640" height="364" class="alignnone size-large wp-image-19894" srcset="/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-18.44.37.png 640w, /wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-18.44.37-300x171.png 300w, /wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-18.44.37-207x118.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>次にAlloというモバイル用のメッセージングアプリが紹介されました。見た目はLineやFacebook messenger等と大差なく見えます。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/c6e3abf4-b7ae-efbb-7e80-867811a417c5.jpeg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/c6e3abf4-b7ae-efbb-7e80-867811a417c5-640x480.jpeg" alt="c6e3abf4-b7ae-efbb-7e80-867811a417c5" width="640" height="480" class="alignnone size-large wp-image-19878" srcset="/wp-content/uploads/2016/06/c6e3abf4-b7ae-efbb-7e80-867811a417c5.jpeg 640w, /wp-content/uploads/2016/06/c6e3abf4-b7ae-efbb-7e80-867811a417c5-300x225.jpeg 300w, /wp-content/uploads/2016/06/c6e3abf4-b7ae-efbb-7e80-867811a417c5-207x155.jpeg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>文字や絵文字の大きさを自由に変えることができることが紹介されました。地味だが良い機能、ということで会場が少し盛り上がります。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/47f7f868-86d2-5fa4-fb9f-1593fa2db0dd.jpeg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/47f7f868-86d2-5fa4-fb9f-1593fa2db0dd-640x480.jpeg" alt="47f7f868-86d2-5fa4-fb9f-1593fa2db0dd" width="640" height="480" class="alignnone size-large wp-image-19872" srcset="/wp-content/uploads/2016/06/47f7f868-86d2-5fa4-fb9f-1593fa2db0dd.jpeg 640w, /wp-content/uploads/2016/06/47f7f868-86d2-5fa4-fb9f-1593fa2db0dd-300x225.jpeg 300w, /wp-content/uploads/2016/06/47f7f868-86d2-5fa4-fb9f-1593fa2db0dd-207x155.jpeg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>しかし当然のことながら、ただのメッセージングアプリではありません。このAlloにはGoogle Assistantの機能が組み込まれており、なんとチャットのテキストや画像を解析して、返信用のテキストを複数提案してくれます。</p>

<p>例えば「Dinner later?」とチャットの相手が送ると、「I&#8217;m in!」「I&#8217;m busy」という返信用のメッセージが表示されます。ユーザは選んでクリックするだけでメッセージを送信することができます。</p>

<p>またチャット内の画像も解析されるので、誰かが犬の写真をアップロードすると、犬種も識別された上で、「Cude dog!」「Aww!」「Nice bernese mountain dog」といった返信メッセージが提示されます。</p>

<p>またGoogle Asisstantのbotががチャットの中に存在するようなかたちになっており、店のお店のサジェストや予約、検索等も対話形式でチャットの中で行うことができるようです。</p>

<p>さらにChromeのようにIncognito Modeが搭載されており、エンドツーエンドでの暗号化やNotificationの制御、メッセージの期限などを設定できるようになっているとのことです。</p>

<h2>Google Duo</h2>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/3651367c-53da-41c7-08ff-33b848f3657e.jpeg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/3651367c-53da-41c7-08ff-33b848f3657e-640x480.jpeg" alt="3651367c-53da-41c7-08ff-33b848f3657e" width="640" height="480" class="alignnone size-large wp-image-19874" srcset="/wp-content/uploads/2016/06/3651367c-53da-41c7-08ff-33b848f3657e.jpeg 640w, /wp-content/uploads/2016/06/3651367c-53da-41c7-08ff-33b848f3657e-300x225.jpeg 300w, /wp-content/uploads/2016/06/3651367c-53da-41c7-08ff-33b848f3657e-207x155.jpeg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>続いてDuoというビデオチャットアプリの紹介です。</p>

<p>ビデオチャットを実現するアプリは数多く世に出ていますが、このDuoにはビデオコールをかけられた側は、応答する前にそのビデオストリームを見ることができるという特徴があるようです。この機能は『Knock Knock』と呼ばれているそうで、これにより着呼側は誰が、どんな状況でコールしてきたのかを知ることができます。</p>

<p>コール先は電話番号に紐づくとのことで、AppleのFaceTimeの競合として考えられそうです。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/9cf474f9-02e2-7500-3c8d-b5b976175073.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/9cf474f9-02e2-7500-3c8d-b5b976175073-640x480.png" alt="9cf474f9-02e2-7500-3c8d-b5b976175073" width="640" height="480" class="alignnone size-large wp-image-19871" srcset="/wp-content/uploads/2016/06/9cf474f9-02e2-7500-3c8d-b5b976175073.png 640w, /wp-content/uploads/2016/06/9cf474f9-02e2-7500-3c8d-b5b976175073-300x225.png 300w, /wp-content/uploads/2016/06/9cf474f9-02e2-7500-3c8d-b5b976175073-207x155.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>DuoはWebRTCとQUICを使用したWebプロトコルベースのアプリと紹介されました。</p>

<p>AlloとDuoはAndroidとiOSで2016年夏頃リリースされる予定で、Android版では事前登録が開始されています。</p>

<ul>
<li><a href="https://play.google.com/store/apps/details?id=com.google.android.apps.fireball" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Google Allo</a></li>
<li><a href="https://play.google.com/store/apps/details?id=com.google.android.apps.tachyon" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Google Duo</a></li>
</ul>

<h2>Android N</h2>

<p>続いてAndroid Nについての発表が行われました。</p>

<p>GoogleがAndroidの開発を行うようになってから、10年が経過したようです。今やAndroidはスマートフォンだけではなく、Android Wear、Android TV、Android Autoなど、多くのプラットフォームが登場しています。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/a34e8828-9bcd-5887-8f9f-649ee8b38bc2.jpeg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/a34e8828-9bcd-5887-8f9f-649ee8b38bc2-640x480.jpeg" alt="a34e8828-9bcd-5887-8f9f-649ee8b38bc2" width="640" height="480" class="alignnone size-large wp-image-19876" srcset="/wp-content/uploads/2016/06/a34e8828-9bcd-5887-8f9f-649ee8b38bc2.jpeg 640w, /wp-content/uploads/2016/06/a34e8828-9bcd-5887-8f9f-649ee8b38bc2-300x225.jpeg 300w, /wp-content/uploads/2016/06/a34e8828-9bcd-5887-8f9f-649ee8b38bc2-207x155.jpeg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>Androidの最新バージョンであるAndroid Nは現在プレビュー版(6/28現在Developer Preview 4)が公開中です。<a href="https://www.android.com/intl/ja_jp/versions/name-n/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">こちら</a>で名前の募集も行われていましたが、現在は終了し近日中に公開されるようです。</p>

<p>Android Nでは、新しいOSのアップデートがあると、自動的にソフトウェアをバッググラウンドでダウンロードし、次回Androidの電源を入れた際にシームレスで新しいソフトウェアイメージに切り替わるようです。</p>

<p>またマルチウィンドウが正式に採用され、スマートフォンでYoutubeを見ながら他のタスクを行ったり、Android TVでは映像を見ながら検索などの他の作業を行うことができるようになります。</p>

<p>現在はAndroid NのDeveloper Preview 4がリリースされており、Nexus 6やNexus 5X等の一部の対応した機種であれば、Android Nを試用することができます。(<a href="http://android-developers.blogspot.jp/2016/06/android-n-apis-are-now-final.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Android Developers Blog</a>)</p>

<h2>Daydream</h2>

<p>続いてI/O開催前から噂が絶えなかったVRに関する発表です。
<a href="https://html5experts.jp/wp-content/uploads/2016/06/a7ac330c-c1bc-6d81-4051-6125b966045d.jpeg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/a7ac330c-c1bc-6d81-4051-6125b966045d-640x480.jpeg" alt="a7ac330c-c1bc-6d81-4051-6125b966045d" width="640" height="480" class="alignnone size-large wp-image-19875" srcset="/wp-content/uploads/2016/06/a7ac330c-c1bc-6d81-4051-6125b966045d.jpeg 640w, /wp-content/uploads/2016/06/a7ac330c-c1bc-6d81-4051-6125b966045d-300x225.jpeg 300w, /wp-content/uploads/2016/06/a7ac330c-c1bc-6d81-4051-6125b966045d-207x155.jpeg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>Androidスマートフォンで高品質なVR体験を提供可能であるDaydreamというプラットフォームが発表されました。</p>

<p>どのようにAndroidスマートフォン上で、高品質なVR体験を可能にするのか、講演では3つの要素が挙げられていました。
まずはスマートフォン本体、次にヘッドセットコントローラのリファレンスデザイン、そしてアプリで、ぞれぞれが協調してエンドツーエンドのユーザ体験を提供するために設計されています。</p>

<p>ハイパフォーマンスセンサーやヘッドトラッキング、表示のレスポンスの速さなど、VR用に作られた仕様を満たしたスマートフォンは、Daydream-readyと呼ばれ、高いクオリティのVR体験を提供することができます。Daydream-readyなスマートフォンは、SamsungやAlcatel、Asusなどの企業から、2016年秋以降リリースされるようです。発表された中に日本の企業はありませんでした。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/334aaad1-e834-a534-12b4-63c89e6ab9f9.jpeg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/334aaad1-e834-a534-12b4-63c89e6ab9f9-640x480.jpeg" alt="334aaad1-e834-a534-12b4-63c89e6ab9f9" width="640" height="480" class="alignnone size-large wp-image-19873" srcset="/wp-content/uploads/2016/06/334aaad1-e834-a534-12b4-63c89e6ab9f9.jpeg 640w, /wp-content/uploads/2016/06/334aaad1-e834-a534-12b4-63c89e6ab9f9-300x225.jpeg 300w, /wp-content/uploads/2016/06/334aaad1-e834-a534-12b4-63c89e6ab9f9-207x155.jpeg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>リファレンスデザインとして紹介されたヘッドセットとコントローラは非常にシンプルなものでした。コントローラはボタンは少なくクリッカブルなタッチパッドがついており、スクロールやスワイプができます。オリエンテーションセンサーも内蔵しており、ユーザがどこをポインティングしているかが分かります。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-18.49.36.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-18.49.36-640x360.png" alt="Screen Shot 2016-06-28 at 18.49.36" width="640" height="360" class="alignnone size-large wp-image-19893" srcset="/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-18.49.36.png 640w, /wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-18.49.36-300x169.png 300w, /wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-18.49.36-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>アプリに関しては、VR用のGoogle Playが開発されており、ユーザーがアプリを探し、購入、インストールがVR上で可能になることが発表されました。またGoogle Play MoviesやGoogle Mapsのストリートビュー、Google Photos、YouTubeもVR上で鑑賞できるようになります。</p>

<p>Daydreamが使えるようになるのは2016年秋になるとのことですが、Android NのDeveloper Previewを使用することでアプリなどの開発は今から行うことができます。</p>

<h2>Android Wear 2.0</h2>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/18168a75-4f59-d2b0-b6fc-9f86caf03b6d.jpeg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/18168a75-4f59-d2b0-b6fc-9f86caf03b6d-640x480.jpeg" alt="18168a75-4f59-d2b0-b6fc-9f86caf03b6d" width="640" height="480" class="alignnone size-large wp-image-19890" srcset="/wp-content/uploads/2016/06/18168a75-4f59-d2b0-b6fc-9f86caf03b6d.jpeg 640w, /wp-content/uploads/2016/06/18168a75-4f59-d2b0-b6fc-9f86caf03b6d-300x225.jpeg 300w, /wp-content/uploads/2016/06/18168a75-4f59-d2b0-b6fc-9f86caf03b6d-207x155.jpeg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>Android Wearは2年前のGoogle I/Oで初めて発表されましたが、今回は初めて大幅なアップデートとなるAndroid Wear 2.0が発表されました。</p>

<p>大きな変化としては、今までAndroid Wearのアプリがインターネットにアクセスするためには母艦となるAndroidやiOSスマートフォンが必要であったことに対し、Android Wear 2.0ではスタンドアロンで動作することが可能になることが挙げられます。アプリが直接BluetoothやWi-Fi、LTEなどを通してインターネットにアクセスできるようになり、ペアリングされたスマートフォンが電源を切っている場合でも、アプリは引き続きフル機能を提供できるようになります。</p>

<p>その他にもUIの刷新や、手書き入力の対応等も発表されました。</p>

<p>Android Wear 2.0はプレビュー版が<a href="https://developer.android.com/wear/preview/index.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">公開</a>されおり、秋には正式リリースとなるようです。</p>

<h2>Progressive Web AppsとAccelerated Mobile Pages</h2>

<p>基調講演も終盤に差しかかり、ここで初めて、わずかですがWebについての発表がありました。
モバイルデバイス上でWebをより快適にするための取り組みとして、Progressive Web AppsとAccelerated Mobile Pagesの2つの紹介です。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.01.42.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.01.42-640x351.png" alt="Screen Shot 2016-06-28 at 19.01.42" width="640" height="351" class="alignnone size-large wp-image-19900" srcset="/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.01.42.png 640w, /wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.01.42-300x165.png 300w, /wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.01.42-207x114.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>Progressive Web Apps、略してPWAppsは、オフライン状態でも動作可能、エンゲージメントを高めるための通知、ホームスクリーンにアイコンを登録、といったネイティブアプリのような振る舞いを実現したWebアプリのことを指します。ChromeにはServiceWorkerをはじめとする、Progressive Web Appsを実現するための仕組みが実装されています。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.01.55.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.01.55-640x353.png" alt="Screen Shot 2016-06-28 at 19.01.55" width="640" height="353" class="alignnone size-large wp-image-19899" srcset="/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.01.55.png 640w, /wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.01.55-300x165.png 300w, /wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.01.55-207x114.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>Accelerated Mobile Pagesは、既存のWeb標準に基づいた非常に速いモバイルWebサイトを作るための、オープンソースのプロジェクトです。</p>

<p>特に新規発表はなく、基調講演内ではわずか1分程度の紹介でしたが、Google I/O全体では多くのPWAppsやAMPのセッションが行われていました。HTML5 Experts.jpでも<a href="https://html5experts.jp/komasshu/19704/" data-wpel-link="internal">Googleが新たに提唱するProgressive Web Appsの新たな開発パターン「PRPL」とは？</a>という記事を公開していますので、そちらをご覧ください。</p>

<h2>Android Studio</h2>

<p>Android Studio 2.2 Previewが公開されたと発表がありました。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.03.28.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.03.28-640x358.png" alt="Screen Shot 2016-06-28 at 19.03.28" width="640" height="358" class="alignnone size-large wp-image-19898" srcset="/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.03.28.png 640w, /wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.03.28-300x168.png 300w, /wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.03.28-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>Android Studio 2.2では、ビルドが10倍、エミュレータも3倍速くなっているそうです。また、新しいレイアウトデザイナやAPKアナライザーが搭載されるとのことでした。</p>

<h2>Firebase</h2>

<p>続いてFirebaseの新バージョンが発表されました。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/1f7e99f1-eb19-5576-3d64-48edebab815b.jpeg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/1f7e99f1-eb19-5576-3d64-48edebab815b-640x480.jpeg" alt="1f7e99f1-eb19-5576-3d64-48edebab815b" width="640" height="480" class="alignnone size-large wp-image-19889" srcset="/wp-content/uploads/2016/06/1f7e99f1-eb19-5576-3d64-48edebab815b.jpeg 640w, /wp-content/uploads/2016/06/1f7e99f1-eb19-5576-3d64-48edebab815b-300x225.jpeg 300w, /wp-content/uploads/2016/06/1f7e99f1-eb19-5576-3d64-48edebab815b-207x155.jpeg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>FirebaseはGoogleが2014年の10月に買収したBaaSサービスです。モバイルアプリに特化した分析ツールである、Firebase Analyticsが発表されました。ユーザがアプリ内で何をしているか、ユーザがどこからきたのかなど分析することが可能です。Android AnalyticsはAndroidでもiOSも扱うことができ、無制限に無料で使用することができると発表されました。</p>

<h2>Android Instant Apps</h2>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/adcac44d-79e3-0921-0316-3e9bf50fc99e.jpeg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/adcac44d-79e3-0921-0316-3e9bf50fc99e-640x480.jpeg" alt="adcac44d-79e3-0921-0316-3e9bf50fc99e" width="640" height="480" class="alignnone size-large wp-image-19868" srcset="/wp-content/uploads/2016/06/adcac44d-79e3-0921-0316-3e9bf50fc99e.jpeg 640w, /wp-content/uploads/2016/06/adcac44d-79e3-0921-0316-3e9bf50fc99e-300x225.jpeg 300w, /wp-content/uploads/2016/06/adcac44d-79e3-0921-0316-3e9bf50fc99e-207x155.jpeg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>今回の基調講演の後半で一際注目を集めたのがこのAndroid Instant Appsではないでしょうか。</p>

<p>Webアプリの場合、ユーザはリンクをクリックするだけでアプリを使用することができますが、Androidアプリはインストールを必要とするため、ユーザがそこで離脱してしまうことが多くあります。その課題を解決する一手となるのが今回発表されたAndroid Instant Appsのようです。</p>

<p>今回発表されたAndroid Instant Appsでは、AndroidアプリがWeb等のリンクからインストールレスで使えるようなるとのことです。</p>

<p>講演中のデモの中では、いくつかのAndroidアプリをURLから起動し、実際にアプリを使用できることが示されていました。
アプリの中の直近で必要になるモジュールだけをフェッチしているらしく、起動も素早く行われ、アプリを使用してからのインストールも非常にスムーズに行えるようです。</p>

<p>これにより、Androidアプリ開発者は、より多くのユーザにリーチできるようになります。AndroidアプリとWebとの親和性が高くなり、Androidアプリのユーザ体験が大きく変わる機能となるのではないでしょうか。</p>

<h2>おわりに</h2>

<p>今年はGoogleのAIの技術力を発揮した製品やサービスが多く発表されました。</p>

<p>基調講演内でWebやChromeに関する発表は非常に少なかったのですが、Google I/O全体では33ものモバイルWebに関するセッションが行われていました。</p>

<p>既に公開されている</p>

<ul>
<li><a href="https://html5experts.jp/ryoyakawai/19335/" data-wpel-link="internal">今、Webの最先端では何が起こっているのか？──最新機能目白押し！Google I/O 2016セッションレポート【前編】</a></li>
<li><a href="https://html5experts.jp/ryoyakawai/19461/" data-wpel-link="internal">Webの最先端では何が起こっているか、今Googleが取り組んでいることは？──Google I/O 2016セッションレポート【後編】</a></li>
<li><a href="https://html5experts.jp/komasshu/19704/" data-wpel-link="internal">Googleが新たに提唱するProgressive Web Appsの新たな開発パターン「PRPL」とは？</a></li>
</ul>

<p>以外にもセッションレポートを公開していく予定です。お楽しみに。</p>
]]></content:encoded>
			</item>
		<item>
		<title>FirebaseとAngular2を使ってリアルタイムでデータのやり取り【導入編】</title>
		<link>/frontainer/19689/</link>
		<pubDate>Mon, 27 Jun 2016 00:00:18 +0000</pubDate>
		<dc:creator><![CDATA[林 優一]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[システム開発]]></category>
		<category><![CDATA[Angular2]]></category>
		<category><![CDATA[Firebase]]></category>

		<guid isPermaLink="false">/?p=19689</guid>
		<description><![CDATA[連載： Angular2で学ぶFirebase入門 (1)Firebaseはリアルタイム同期なデータベースを中心に、Auth認証やPushNotificationやユーザーの行動分析といったアプリケーションに最適な機能を...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/firebase/" class="series-379" title="Angular2で学ぶFirebase入門" data-wpel-link="internal">Angular2で学ぶFirebase入門</a> (1)</div><p>Firebaseはリアルタイム同期なデータベースを中心に、Auth認証やPushNotificationやユーザーの行動分析といったアプリケーションに最適な機能を提供するBasSです。先月行われたGoogle IOにて、PushNotificationや行動分析機能が追加されるなど話題となりました。</p>

<p>今回はFirebaseのリアルタイムベースとAngular2を用いて、リアルタイムにデータをやり取りする方法について解説します。</p>

<h2>Firebaseのリアルタイムデータベース</h2>

<p>Firebaseのリアルタイムデータベースはクラウドホスト型のNoSQLデータベースです。JSONの形式でデータは保存されます。
APIはもちろん、iOS/Android/Web用のSDKが提供されているので、非常に簡単に導入することができます。</p>

<p>また、ネットワークが途中で切れた場合は自動的に再接続を行い、復帰後に改めてデータが同期されます。同時100コネクション、1GBのデータ、10GBの転送量までは無料で使うことができるので、まず試してみるといったことができます。</p>

<p>今回はこの無料プランとAngular2を使って進めていきます。</p>

<h2>Angular CLIで環境構築</h2>

<p>Angular2の環境構築が初めての方でも簡単に導入できるように、Angular2ではCLIが公開されています。これを利用して環境を構築していきます。（※別途、Node.jsのインストールが必要です）</p>

<p><a href="https://github.com/angular/angular-cli" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">angular-cli</a></p>

<p>まずはnpmを使って、angular-cliをインストールします。</p>

<p></p><pre class="crayon-plain-tag">npm install -g angular-cli</pre><p></p>

<p>インストールが成功していれば、<code>ng version</code>でバージョンが表示されます。</p>

<p></p><pre class="crayon-plain-tag">angular-cli: 1.0.0-beta.5
node: 5.6.0
os: darwin x64</pre><p></p>

<p>続いて、<code>ng new</code>コマンドを用いてプロジェクトを作成します。newの後には任意のプロジェクト名を入力してください。（angularやfirebaseという名称を用いるとパッケージ名が重複してしまうため、関連ライブラリのインストールに失敗するのでご注意ください）</p>

<p></p><pre class="crayon-plain-tag">ng new sample
cd sample</pre><p></p>

<p>今回は<code>ng new sample</code>でプロジェクトを作成します。</p>

<p>sampleというフォルダができるので<code>cd sample</code>で移動し、この状態で <code>ng serve</code> コマンドを実行するとサンプルのアプリケーションがビルドされ、<code>http://localhost:4200/</code>にブラウザでアクセスすると<code>sample works!</code>と表示されます。</p>

<p>これで開発環境の準備が整いました。</p>

<h2>AngularFire導入</h2>

<p>本題のAngularFireを導入していきます。</p>

<p><a href="https://github.com/angular/angularfire2" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">angularfire2</a></p>

<p></p><pre class="crayon-plain-tag">npm install angularfire2 firebase@2.4.2 --save</pre><p></p>

<p>※ 6月14日現在の最新版は、firebase 2.4.2に対応しています。</p>

<p>続いて、firebase用の型定義ファイルをインストールします。
<code>typings</code>がインストールされていない場合は <code>npm i -g typings</code>を実行してインストールをしてください。</p>

<p></p><pre class="crayon-plain-tag">typings install dt~firebase --save --global</pre><p></p>

<p>※ 注意</p>

<p>typings 1系と0系では、コマンドやインストールされるファイルの構成が異なります。現在のバージョンのangular-cliでは0系でインストールされますが、npmでインストールされる最新版は1系になります。本稿では1系がインストールされている状態で解説を行います。0系の場合は以下のtypingsに追記する作業は必要ありません。</p>

<p><code>src/typings.d.ts</code>にインストールされたfirebaseの型定義ファイル群を追記します。</p>

<p></p><pre class="crayon-plain-tag">/// &lt;reference path="../typings/browser.d.ts" /&gt;
/// &lt;reference path="../typings/index.d.ts" /&gt;
declare var module: { id: string };</pre><p></p>

<p>angular-cli-build.jsを開き、<code>vendorNpmFiles</code>に<code>'angularfire2/**/*.js'</code> <code>'firebase/lib/*.js'</code> を追記します。</p>

<p></p><pre class="crayon-plain-tag">var Angular2App = require('angular-cli/lib/broccoli/angular2-app');

module.exports = function(defaults) {
  return new Angular2App(defaults, {
    vendorNpmFiles: [
      'systemjs/dist/system-polyfills.js',
      'systemjs/dist/system.src.js',
      'zone.js/dist/**/*.+(js|js.map)',
      'es6-shim/es6-shim.js',
      'reflect-metadata/**/*.+(js|js.map)',
      'rxjs/**/*.+(js|js.map)',
      '@angular/**/*.+(js|js.map)',
      'angularfire2/**/*.js', // &lt;- 追加
      'firebase/lib/*.js'      // &lt;- 追加
    ]
  });
};</pre><p></p>

<p>続いて、/src/system-config.tsに以下のようにfirebase,angularfire2の記述を追記します。</p>

<p></p><pre class="crayon-plain-tag">/** Map relative paths to URLs. */
const map: any = {
  'firebase': 'vendor/firebase/lib/firebase-web.js',
  'angularfire2': 'vendor/angularfire2'
};

/** User packages configuration. */
const packages: any = {
  angularfire2: {
    defaultExtension: 'js',
    main: 'angularfire2.js'
  }
}</pre><p></p>

<p>これでAngular2でFirebaseを使う準備が整いました。</p>

<h2>Firebaseの登録</h2>

<p>続いて、Firebaseの登録と設定を行っていきましょう。</p>

<p><a href="https://firebase.google.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">firebase</a></p>

<p><img src="/wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.46.07-640x194.png" alt="Screen Shot 0028-06-14 at 22.46.07" width="640" height="194" class="alignnone size-large wp-image-19695" srcset="/wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.46.07.png 640w, /wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.46.07-300x91.png 300w, /wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.46.07-207x63.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>FirebaseはGoogleアカウントで登録することができます。登録が完了すると、プロジェクトを作るためのボタンが表示されます。</p>

<p><img src="/wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.47.30-640x235.png" alt="Screen Shot 0028-06-14 at 22.47.30" width="640" height="235" class="alignnone size-large wp-image-19696" srcset="/wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.47.30.png 640w, /wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.47.30-300x110.png 300w, /wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.47.30-207x76.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>「新規プロジェクトを作成」ボタンをクリックして、アプリケーションを作成しましょう。</p>

<p><img src="/wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.48.17.png" alt="Screen Shot 0028-06-14 at 22.48.17" width="449" height="445" class="alignnone size-full wp-image-19697" srcset="/wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.48.17.png 449w, /wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.48.17-150x150.png 150w, /wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.48.17-300x297.png 300w, /wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.48.17-207x205.png 207w" sizes="(max-width: 449px) 100vw, 449px" /></p>

<p>アプリケーションが作成できたら「Database」ページを開きます。
以下のように、まだデータベースには何も入っていません。まずはこの画面から初期データを登録してみましょう。</p>

<p><img src="/wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.55.35.png" alt="Screen Shot 0028-06-14 at 22.55.35" width="294" height="57" class="alignnone size-full wp-image-19698" srcset="/wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.55.35.png 294w, /wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.55.35-207x40.png 207w" sizes="(max-width: 294px) 100vw, 294px" /></p>

<p>このようにデータを作成しました。</p>

<p></p><pre class="crayon-plain-tag">{
  items: {
    0: {
      value: &#039;item0001&#039;
    },
    2: {
      value: &#039;item0002&#039;
    },
    2: {
      value: &#039;item0003&#039;
    }
  }
}</pre><p></p>

<p>Firebase上では、すべてオブジェクトの形式でデータが構成されるようにしておきます。</p>

<p>続いて、「ルール」のタブをクリックしてルールを設定します。
ルールはデータベースへの値に対してのアクセス権の設定を行うことができます。JSONの形式でデータを定義していきます。</p>

<p><img src="/wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.58.07-640x333.png" alt="Screen Shot 0028-06-14 at 22.58.07" width="640" height="333" class="alignnone size-large wp-image-19699" srcset="/wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.58.07.png 640w, /wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.58.07-300x156.png 300w, /wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.58.07-207x108.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>詳しいルールの記載は、以下のページに説明があります。
<a href="https://html5exp-sample.firebaseio.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">https://html5exp-sample.firebaseio.com/</a></p>

<p>ここではサンプルということで、読み書きともに誰からでもできるように設定しておきましょう。</p>

<p></p><pre class="crayon-plain-tag">{
  "rules": {
    "items": {
      ".read": "true",
      ".write": "true"
    }
  }
}</pre><p></p>

<p>これによってデータベースの<code>items</code>以下は、読み書きともに誰でも許可されるようになりました。では、これで登録したデータが読み取れるか試してみましょう。/src/main.tsを開きます。</p>

<p></p><pre class="crayon-plain-tag">import { bootstrap } from '@angular/platform-browser-dynamic';
import { enableProdMode } from '@angular/core';
import { SampleAppComponent, environment } from './app/';
import { FIREBASE_PROVIDERS, defaultFirebase } from 'angularfire2'; // &lt;- add

if (environment.production) {
  enableProdMode();
}

bootstrap(SampleAppComponent,[
  FIREBASE_PROVIDERS, // &lt;- add
  defaultFirebase('https://&lt;your-firebase-app&gt;.firebaseio.com/') // &lt;- add
]);</pre><p></p>

<p><code>main.ts</code> にangularfire2のファイルをimportし、bootstrap関数の第２引数に<code>FIREBASE_PROVIDERS</code>と <code>defaultFirebase('https://.firebaseio.com/')</code> を配列で渡しておきます。</p>

<p>こうすることによって、今後Angular2のコンポーネント内でFirebaseに必要な設定とプロバイダが提供されるようになります。</p>

<p>続いて、画面にデータを表示するためのコンポーネントに変更を加えます。</p>

<p></p><pre class="crayon-plain-tag">import { Component } from '@angular/core';
import { AngularFire, FirebaseListObservable } from 'angularfire2'; //&lt;- add

@Component({
  moduleId: module.id,
  selector: 'sample-app',
  templateUrl: 'sample.component.html',
  styleUrls: ['sample.component.css']
})
export class SampleAppComponent {
  title = 'sample works!';
  items: FirebaseListObservable&lt;any[]&gt;;
  constructor(af: AngularFire) {
		this.items = af.database.list('/items');
  }
}</pre><p></p>

<p></p><pre class="crayon-plain-tag">&lt;h1&gt;{{title}}&lt;/h1&gt;
&lt;ul *ngFor="let item of items | async"&gt;
  &lt;li class="text"&gt;
    {{item.value}}
  &lt;/li&gt;
&lt;/ul&gt;</pre><p></p>

<p><code>*ngFor="let item of items | async"</code> のasyncはAsyncPipeと呼ばれるAngular2にはじめから組み込まれているPipeのひとつです。これはitemsのObservableをsubscribeしたときの引数を自動的に取得して表示してくれるPipeです。詳しい使い方や解説は以下のページにありますので、こちらをご一読ください。</p>

<p><a href="https://angular.io/docs/ts/latest/guide/pipes.html#!#async-pipe" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Async Pipe</a></p>

<p><code>ng serve</code> コマンドを改めて実行すると、Firebaseで登録されたデータが表示されるようになります。</p>

<h2>データの追加</h2>

<p>次にブラウザからデータを追加する処理を実装していきましょう。</p>

<p></p><pre class="crayon-plain-tag">export class SampleAppComponent {
  title = 'sample works!';
  items: FirebaseListObservable&lt;any[]&gt;;
  constructor(af: AngularFire) {
    this.items = af.database.list('/items');
  }
  addItem(value:string) {
    this.items.push({value:value});
  }
}</pre><p></p>

<p></p><pre class="crayon-plain-tag">&lt;h1&gt;{{title}}&lt;/h1&gt;
&lt;ul *ngFor="let item of items | async"&gt;
  &lt;li class="text"&gt;
    {{item.value}}
  &lt;/li&gt;
&lt;/ul&gt;

&lt;form (ngSubmit)="addItem(newItem.value);newItem.value=''"&gt;
  &lt;input type="text" #newItem&gt;
  &lt;button&gt;send&lt;/button&gt;
&lt;/form&gt;</pre><p></p>

<p><code>FirebaseListObservable</code>にデータを<code>push</code>するだけで配列データにデータを追加することができます。</p>

<h2>データの更新</h2>

<p>今度はリストのデータを更新してみましょう。</p>

<p></p><pre class="crayon-plain-tag">export class SampleAppComponent {
  title = 'sample works!';
  items: FirebaseListObservable&lt;any[]&gt;;
  constructor(af: AngularFire) {
    this.items = af.database.list('/items');
  }
  addItem(value:string) {
    this.items.push({value:value});
  }
  updateItem(key:string,value:string) {
	  this.items.update(key,{value:value});
  }
}</pre><p></p>

<p></p><pre class="crayon-plain-tag">&lt;h1&gt;{{title}}&lt;/h1&gt;
&lt;ul *ngFor="let item of items | async"&gt;
  &lt;li class="text"&gt;
    {{item.value}}
    &lt;input [(ngModel)]="item.value" (keyup)="updateItem(item.$key,item.value)"/&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;form (ngSubmit)="addItem(newItem.value);newItem.value=''"&gt;
  &lt;input type="text" #newItem&gt;
  &lt;button&gt;send&lt;/button&gt;
&lt;/form&gt;</pre><p></p>

<p><code>this.items.update(key,{value:value});</code>のように更新したいデータの$keyと値を渡すことで更新ができます。
Firebaseのオブジェクトには$keyというプロパティがあり、各データのKey名を取得することができます。
pushで追加されたデータは、一意なKeyが自動で振られるようになっています。</p>

<h2>データの削除</h2>

<p>続いて、リストのデータを削除してみましょう。</p>

<p></p><pre class="crayon-plain-tag">export class SampleAppComponent {
  title = 'sample works!';
  items: FirebaseListObservable&lt;any[]&gt;;
  constructor(af: AngularFire) {
    this.items = af.database.list('/items');
  }
  addItem(value:string) {
    this.items.push({value:value});
  }
  updateItem(key:string,value:string) {
	  this.items.update(key,{value:value});
  }
  deleteItem(key:string) {
	  this.items.remove(key);
  }
  deleteAll() {
	  this.items.remove();
  }
}</pre><p></p>

<p></p><pre class="crayon-plain-tag">&lt;h1&gt;{{title}}&lt;/h1&gt;
&lt;ul *ngFor="let item of items | async"&gt;
  &lt;li class="text"&gt;
    {{item.value}}
    &lt;input [(ngModel)]="item.value" (keyup)="updateItem(item.$key,item.value)"/&gt;
    
    &lt;button (click)="removeItem(item.$key)"&gt;削除&lt;/button&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;form (ngSubmit)="addItem(newItem.value);newItem.value=''"&gt;
  &lt;input type="text" #newItem&gt;
  &lt;button&gt;send&lt;/button&gt;
&lt;/form&gt;

&lt;button (click)="removeAll()"&gt;全削除&lt;/button&gt;</pre><p></p>

<p>更新と同様に<code>this.items.remove(key);</code>と削除したいデータのKeyを渡すことで、そのデータのみを削除することができます。</p>

<p><code>this.items.remove();</code>とKeyを渡さずにremoveするとリスト全体が削除されるので注意してください。</p>

<p>このように非常に簡単にデータの読み書きが実装できてしまいます。</p>

<h2>オブジェクトデータの取り扱い</h2>

<p>続いて、今度はリストデータでなく単一のオブジェクトのデータを扱ってみましょう。Firebaseの管理画面でDatabaseのデータに以下のような<code>constants</code>を追加しました。</p>

<p></p><pre class="crayon-plain-tag">{
  constants: {
    title: "My first firebase app"
  },
  items: {
    ...
  }
}</pre><p></p>

<p>ルール設定ページにいき、constantsは読み込み専用に設定しておきます。</p>

<p></p><pre class="crayon-plain-tag">{
  "rules": {
    "constants": {
      ".read": "true",
      ".write": "false"
    },
    "items": {
      ".read": "true",
      ".write": "true"
    }
  }
}</pre><p></p>

<p>src/app/sample.component.tsを、以下のように修正します。</p>

<p></p><pre class="crayon-plain-tag">import { Component } from '@angular/core';
import { AngularFire, FirebaseListObservable, FirebaseObjectObservable } from 'angularfire2'; //&lt;- add

@Component({
  moduleId: module.id,
  selector: 'sample-app',
  templateUrl: 'sample.component.html',
  styleUrls: ['sample.component.css']
})
export class SampleAppComponent {
  constants: FirebaseObjectObservable&lt;any&gt;;
  items: FirebaseListObservable&lt;any[]&gt;;
  constructor(af: AngularFire) {
    this.constants = af.database.object('/constants');
    this.items = af.database.list('/items');
  }
  addItem(value:string) {
    this.items.push({value:value});
  }
  updateItem(key:string,value:string) {
    this.items.update(key,{value:value});
  }
  deleteItem(key:string) {
    this.items.remove(key);
  }
  deleteAll() {
    this.items.remove();
  }
}</pre><p></p>

<p>そして、ビューのタイトル部分をconstantsから取得して表示させるようにします。</p>

<p></p><pre class="crayon-plain-tag">&lt;h1&gt;{{(constants | async)?.title}}&lt;/h1&gt;
&lt;ul *ngFor="let item of items | async"&gt;
  &lt;li class="text"&gt;
    &lt;input [(ngModel)]="item.value" (keyup)="updateItem(item.$key,item.value)"/&gt;

    &lt;button (click)="deleteItem(item.$key)"&gt;削除&lt;/button&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;form (ngSubmit)="addItem(newItem.value);newItem.value=''"&gt;
  &lt;input type="text" #newItem&gt;
  &lt;button&gt;send&lt;/button&gt;
&lt;/form&gt;

&lt;button (click)="deleteAll()"&gt;全削除&lt;/button&gt;</pre><p></p>

<p>こうすることで、オブジェクトのデータを読み込んで画面に表示させることができました。</p>

<h2>オブジェクトの更新</h2>

<p>オブジェクトの更新をする際は、リストと同様にupdate関数を用いて変更を行うことができます。その時にはルールで書き込みが許可されている必要があります。</p>

<p></p><pre class="crayon-plain-tag">this.constants.update({title:"new title"});</pre><p></p>

<h2>オブジェクトの削除</h2>

<p>オブジェクトの削除を行う際にはremove関数を用いますが、以下のようにremoveするとconstantsごと削除されます。</p>

<p></p><pre class="crayon-plain-tag">this.constants.remove(); // constantsごと削除</pre><p></p>

<p>１つのプロパティのみを削除したい場合は、以下のように削除したいプロパティまで取得した上でremove関数を実行します。</p>

<p></p><pre class="crayon-plain-tag">af.database.object('/constants/title').remove(); //titleだけ削除</pre><p></p>

<h2>まとめ</h2>

<p>このようにAngular2とFirebaseを使うことで、簡単にリアルタイムにデータのやり取りを行うことができるようになります。</p>

<p>今回はサンプルということで誰でも読み書きできる形にしていますが、ユーザー認証をFirebaseで作ったり、既にあるログイン情報を利用して認証させたりできるので、新規でも追加でも導入しやすくなっています。</p>

<p>次回はその認証機能を用いてログインすると書き込みができるようにしていきたいと思います。</p>
]]></content:encoded>
		
		<series:name><![CDATA[Angular2で学ぶFirebase入門]]></series:name>
	</item>
		<item>
		<title>Firebaseで作る簡単リアルタイムウェブアプリケーション（前編）</title>
		<link>/technohippy/18040/</link>
		<pubDate>Tue, 19 Jan 2016 00:00:44 +0000</pubDate>
		<dc:creator><![CDATA[あんどう やすし]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[サイト制作]]></category>
		<category><![CDATA[BaaS]]></category>
		<category><![CDATA[Firebase]]></category>

		<guid isPermaLink="false">/?p=18040</guid>
		<description><![CDATA[Firebaseは2014年10月にGoogleに買収されたことで一躍有名になったBaaS（Backend as a Service）です。本記事ではちょっとしたリアルタイムウェブアプリケーションを作りながらFireba...]]></description>
				<content:encoded><![CDATA[<p><a href="https://www.firebase.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Firebase</a>は2014年10月にGoogleに買収されたことで一躍有名になったBaaS（Backend as a Service）です。本記事ではちょっとしたリアルタイムウェブアプリケーションを作りながらFirebaseの機能を紹介します。</p>

<h2>Firebaseとは</h2>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/01/3a345fd10f12d48416c28c3d696e92f2.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/01/3a345fd10f12d48416c28c3d696e92f2-300x219.png" alt="https://www.firebase.com/" width="300" height="219" class="size-medium wp-image-18079" srcset="/wp-content/uploads/2016/01/3a345fd10f12d48416c28c3d696e92f2-300x219.png 300w, /wp-content/uploads/2016/01/3a345fd10f12d48416c28c3d696e92f2.png 640w, /wp-content/uploads/2016/01/3a345fd10f12d48416c28c3d696e92f2-207x151.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<p><a href="https://www.firebase.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Firebase</a>はデータストレージ、ユーザー管理などアプリケーションのバックエンドとして必要となる機能をサービスを提供することで、アプリケーション開発者がクライアントサイドの開発に集中できるようにしてくれるBaaS（Backend as a Service）の一種です。</p>

<p>2014年10月にGoogleに買収され、<a href="https://cloud.google.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Google Cloud Platform</a>（GCP）の一員となりました。この買収によりGCPにはPaaS（Platform as a Service）として<a href="https://cloud.google.com/appengine/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Google App Engine</a>、IaaS（Infrastracture as a Service）として<a href="https://cloud.google.com/compute/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Google Compute Engine</a>、BaaSとしてFirebaseと、いわゆるXaaS系が一通り揃ったことになります。</p>

<h2>Firebaseの特徴</h2>

<p>Firebaseはもともとは開発者用APIを持つウェブサイトに埋め込み可能なリアルタイムチャットサービスとして始まりました。</p>

<p>しかし、多くのユーザーがチャットサービスとしてではなく、ゲームなどのアプリケーションでリアルタイムにデータを同期するために使用したため、創業者たちはチャットサービスのリアルタイムメッセージングシステムを切り出して別サービスとしました。これが現在のFirebaseの元となっています。</p>

<p>そのため、Firebaseは数あるBaasの中でも特にチャットアプリのようなリアルタイムにデータを同期する必要があるサービスに適しています。</p>

<h2>Firebaseの機能</h2>

<h3>リアルタイムデータベース</h3>

<p>FirebaseのデータベースはスキーマレスないわゆるNoSQLで、特定のアプリケーションに関係するデータ全体がひとつのJSONオブジェクトとして保持される点が大きな特徴です。</p>

<p>これによりデータが階層構造をなすため、それぞれのデータが一意のURLを持つことができます。例えばデータベース全体を指すURLは以下のようになります。</p>

<ul>
<li>https://アプリケーションID.firebaseio.com/</li>
</ul>

<p>特定のデータを示すURLは以下のようになります。</p>

<ul>
<li>https://アプリケーションID.firebaseio.com/プロパティのパス</li>
</ul>

<p>例えばアプリケーション名 my-first-chat-app のデータ全体が以下の様であるとして</p>

<p></p><pre class="crayon-plain-tag">{
  "messages" : {
    "-K5kPGFquoTbqHYQqBRS" : {
      "body" : "message",
      "name" : "name"
    },
    "-K5kPUqfBfdj4bAa1fyv" : {
      "body" : "message2",
      "name" : "name2"
    },
    "-K5kR-lwtG4I5w9T36Xq" : {
      "body" : "message3",
      "name" : "name3"
    }
}</pre><p></p>

<p>最初のメッセージ（messages/-K5kPGFquoTbqHYQqBRS）の内容だけを確認したいのであれば、次のURLをブラウザで表示すればいいということになります。</p>

<ul>
<li>https://my-first-chat-app.firebaseio.com/messages/-K5kPGFquoTbqHYQqBRS</li>
</ul>

<div id="attachment_18064" style="width: 310px" class="wp-caption alignnone"><a href="https://html5experts.jp/wp-content/uploads/2016/01/2b6f6d52f428612fc49a0c207320bcaa.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/01/2b6f6d52f428612fc49a0c207320bcaa-300x250.png" alt="/messages/-K5kPGFquoTbqHYQqBRS" width="300" height="250" class="size-medium wp-image-18064" srcset="/wp-content/uploads/2016/01/2b6f6d52f428612fc49a0c207320bcaa-300x250.png 300w, /wp-content/uploads/2016/01/2b6f6d52f428612fc49a0c207320bcaa.png 640w, /wp-content/uploads/2016/01/2b6f6d52f428612fc49a0c207320bcaa-207x172.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a><p class="wp-caption-text">特定データの表示</p></div>

<h3>認証</h3>

<p>Firebaseを使用すると非常に簡単にユーザー認証をアプリケーションに組み込むことができます。組み込みの認証機構としては、メールアドレスとパスワードを使用した認証、OAuthを使用した認証（Facebook, Twitter, GitHub, Google）、匿名ログインがあり、加えてJSON Web Tokens (JWTs)を使用して既存の任意の認証システムと連携することも容易です。</p>

<h3>ホスティング</h3>

<p>HTML、CSS、JS、画像などの静的なアセットは、Firebaseコマンドラインツールを使用して自身のドメイン上（<code>アプリケーションID.firebaseapp.com</code>）、もしくは有料プランであれば独自ドメイン上に簡単にデプロイすることができます。</p>

<p>さらにデプロイの履歴は管理画面で見ることができ、問題があった場合には以前のバージョンにロールバックすることも可能です。</p>

<h4>コマンドラインツール</h4>

<p>Firebaseのホスティングサービスを利用するにはFirebaseコマンドラインツールを使用する必要があります。node.jsとnpmがインストールされていればコマンドツールは以下のコマンドで簡単にインストールできます。</p>

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

<p>firebaseコマンドで利用可能なサブコマンドは、以下のとおりです。</p>

<dl>
<dt><strong>firebase init</strong></dt>
<dd>プロジェクトディレクトリを初期化します。ホスティングサービスに必要なすべての設定は当コマンドによりプロジェクトディレクトリルートに作成されるfirebase.jsonファイルに含まれます</dd>
<dt><strong>firebase deploy</strong></dt>
<dd>現在のプロジェクトをサーバーにデプロイします</dd>
<dt><strong>firebase disable:hosting</strong></dt>
<dd>ホスティングを無効にし、アクセスに対し&#8221;Site Not Found&#8221;ページを表示するようにします</dd>
<dt><strong>firebase login</strong></dt>
<dd>コマンドラインツールをログインします</dd>
<dt><strong>firebase logout</strong></dt>
<dd>コマンドラインツールをログアウトします</dd>
<dt><strong>firebase list</strong></dt>
<dd>現在ログイン中のユーザーが利用可能なFirebaseアプリの一覧を表示します</dd>
</dl>

<h3>APIとSDK</h3>

<p>FirebaseデータベースにはREST APIがあり、さらにそのAPIを利用する各種環境用のクライアントライブラリが標準で用意されています。</p>

<ul>
<li><a href="https://www.firebase.com/docs/web/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Web</a>（JavaScript）</li>
<li><a href="https://www.firebase.com/docs/ios/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">iOS</a>（Objective C）</li>
<li><a href="https://www.firebase.com/docs/android/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Android</a>（Java）</li>
</ul>

<p>なお、これらの標準クライアントライブラリを使用するとFirebaseはオフラインでの動作が保証されます。つまりネットワーク接続がない場合でも、Firebaseデータベースの読み書きの対象を一旦ローカルのキャッシュとすることで、アプリケーションは正常に動作します。その後、接続が復活した時に内容がサーバーと同期されます。</p>

<p>また、標準ライブラリに加えて、REST APIを使用する非公式なライブラリとして以下の様なものもあります。これ以外にもいろいろとありますので、サーバーサイドで自分の好きな言語を利用したい場合はGitHubなどで検索してみるといいでしょう。</p>

<ul>
<li><a href="http://ozgur.github.io/python-firebase/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Python-Firebase</a>（Python）</li>
<li><a href="https://github.com/ktamas77/firebase-php" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Firebase-Php</a>（PHP）</li>
<li><a href="https://github.com/oscardelben/firebase-ruby" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Firebase-Ruby</a>（Ruby）</li>
<li><a href="http://derailed.github.io/bigbertha" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">BigBertha</a>（Ruby）</li>
<li><a href="https://github.com/CodementorIO/rest-firebase" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Rest-Firebase</a>（Ruby）</li>
</ul>

<p>なお、標準クライアントライブラリを使用した場合はオフラインでの動作が保証されますが、非公式ライブラリを使用した場合はその限りではありません。</p>

<h2>サンプルアプリケーション</h2>

<p>Firebaseを使用した基本的なアプリケーション開発の流れを確認するために簡単なチャットアプリケーションを作成してみましょう。先に紹介したとおりFirebaseクライアントライブラリは環境に応じて複数ありますが、今回はJavaScript版クライアントライブラリを使用してWebアプリケーションを作成します。</p>

<div id="attachment_18083" style="width: 310px" class="wp-caption alignnone"><a href="https://html5experts.jp/wp-content/uploads/2016/01/bb56fbf12877898b24cd5b42c9fce5a5.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/01/bb56fbf12877898b24cd5b42c9fce5a5-300x213.png" alt="サンプルチャット" width="300" height="213" class="size-medium wp-image-18083" srcset="/wp-content/uploads/2016/01/bb56fbf12877898b24cd5b42c9fce5a5-300x213.png 300w, /wp-content/uploads/2016/01/bb56fbf12877898b24cd5b42c9fce5a5.png 640w, /wp-content/uploads/2016/01/bb56fbf12877898b24cd5b42c9fce5a5-207x147.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a><p class="wp-caption-text">サンプルチャット</p></div>

<h3>Firebaseアプリケーション作成</h3>

<p>まずはじめに、今回のサンプルから使用するデータベースを用意するため、ウェブコンソールからFirebaseアプリケーションを作成します。http://firebase.com/ を開き、画面右上のログインボタンをクリックしてログインしてください。</p>

<p>アカウントを新たに作成しても構いませんし、GoogleアカウントやGitHubアカウントを使用してログインすることもできます。</p>

<div id="attachment_18085" style="width: 310px" class="wp-caption alignnone"><a href="https://html5experts.jp/wp-content/uploads/2016/01/36fe728933b58011dce534fb2979b11d.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/01/36fe728933b58011dce534fb2979b11d-300x213.png" alt="Firebaseログイン後" width="300" height="213" class="size-medium wp-image-18085" srcset="/wp-content/uploads/2016/01/36fe728933b58011dce534fb2979b11d-300x213.png 300w, /wp-content/uploads/2016/01/36fe728933b58011dce534fb2979b11d.png 640w, /wp-content/uploads/2016/01/36fe728933b58011dce534fb2979b11d-207x147.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a><p class="wp-caption-text">Firebaseログイン後</p></div>

<p>ログイン後、左下の入力エリアにアプリ名とアプリURLを入力して、アプリを作成します。今回は以下の様な設定を使用するものとします。</p>

<table>
<tr><th>App Name</th><td>My First Chat App</td></tr>
<tr><th>App URL</th><td>https://my-first-chat-app.firebaseio.com/</td></tr>
</table>

<div id="attachment_18086" style="width: 310px" class="wp-caption alignnone"><a href="https://html5experts.jp/wp-content/uploads/2016/01/f6e4e49af30774d12e164a9df2864b08.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/01/f6e4e49af30774d12e164a9df2864b08-300x213.png" alt="スクリーンショット 2015-12-17 22.46.32" width="300" height="213" class="alignnone size-medium wp-image-18086" srcset="/wp-content/uploads/2016/01/f6e4e49af30774d12e164a9df2864b08-300x213.png 300w, /wp-content/uploads/2016/01/f6e4e49af30774d12e164a9df2864b08.png 640w, /wp-content/uploads/2016/01/f6e4e49af30774d12e164a9df2864b08-207x147.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a><p class="wp-caption-text">Firebaseアプリ新規作成</p></div>

<p>サーバーサイドで行う作業は以上です。これだけでNoSQLデータベースが作成され、クライアントアプリから自由に利用できるようになりました。</p>

<h3>サンプルアプリケーションの初期化</h3>

<p>サンプルアプリケーションは最終的にFirebaseホスティングサービスを利用するため、まずfirebase initコマンドを実行してプロジェクトディレクトリを初期化します。</p>

<p></p><pre class="crayon-plain-tag">% firebase init

? What Firebase do you want to use? my-first-chat-app
? What directory should be the public root? public
✔  Public directory public has been created
Firebase initialized, configuration written to firebase.json</pre><p></p>

<p>初期化にあたって</p>

<ol>
<li>アプリ名</li>
<li>デプロイするファイルを配置するディレクトリ</li>
</ol>

<p>を聞かれるので、アプリ名は先程作成したものを、ディレクトリ名はデフォルトのpublicを設定してください。</p>

<h3>ウェブアプリケーション作成</h3>

<p>それではここから実際に冒頭のサンプルアプリケーションを作成していくこととします。といっても必要となるのはHTMLファイルが一つだけ、それも非常に小さなものですので先に全体を見てしまいましょう。</p>

<p></p><pre class="crayon-plain-tag">&lt;!DOCTYPE html&gt;
&lt;html lang="ja"&gt;
  &lt;head&gt;
    &lt;meta charset="utf-8" /&gt;
    &lt;title&gt;Firebaseサンプル1&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;div&gt;
      &lt;input id="name" placeholder="名前" /&gt;
      &lt;input id="message" placeholder="メッセージ" /&gt;
      &lt;button id="send"&gt;投稿&lt;/button&gt;
    &lt;/div&gt;
    &lt;ul id="messages"&gt;
    &lt;/ul&gt;

    &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0-alpha1/jquery.min.js"&gt;&lt;/script&gt;
    &lt;script src="https://cdn.firebase.com/js/client/2.3.2/firebase.js"&gt;&lt;/script&gt;
    &lt;script&gt;
      // データベースの参照を準備
      var firebaseRef = new Firebase("https://my-first-chat-app.firebaseio.com/"); // ... 1
      var messagesRef = firebaseRef.child('messages'); // ... 2

      // 既存メッセージを表示
      messagesRef.on('child_added', function(snapshot) { // ... 3
        var msg = snapshot.val();
        $('&lt;li&gt;').text(msg.name + ': ' + msg.body).prependTo('#messages');
      });

      $('#send').click(function() {
        // 新規メッセージを投稿
        messagesRef.push({ // ... 4
          name: $('#name').val(),
          body: $('#message').val()
        });
      });
    &lt;/script&gt;
  &lt;/body&gt;
&lt;/html&gt;</pre><p></p>

<p>今回のサンプルアプリケーションのコードはこれだけ、コメントや空行を除けばJavaScript部分はたったの12行です。このコードをローカルに保存し、ブラウザで開いてみてください。HTMLを含めて全体でも40行弱のコードですが、複数ブラウザで開いて、一方でメッセージを入力すればその内容はリアルタイムに他方に反映され、（かろうじて）チャットとして利用できます。</p>

<p>コードの詳細については次回以降に譲りますが、簡単に説明すると、行われている処理は以下のとおりです。</p>

<ol>
<li>アプリケーションURLを引数としてFirebaseオブジェクトをインスタンス化し、前節で作成したFirebaseデータベースに接続するためのオブジェクトを生成します。</li>
<li>Firebaseデータベースのmessagesオブジェクトへの参照を取得します。この参照への操作はサーバー上のFirebaseデータベースに保存されることになります。</li>
<li>messagesオブジェクトに子ノードが追加された場合のコールバック関数を登録します。今回はコールバック関数内でメッセージの内容をli要素としてul要素に追加しています。なお、onメソッドで登録されたコールバック関数はHTMLの初回読み込み時にも実行されるため、初回読み込み時用の処理を特別に記述する必要はありません。</li>
<li>messagesオブジェクトに子ノードを追加します。</li>
</ol>

<h4>オフライン対応の確認</h4>

<p>さて、ここで一つ面白い実験をしてみましょう。複数のブラウザでサンプルアプリを開き、使用しているコンピューターのネットワークをOFFにしてください。</p>

<p>そのまま一方の画面でメッセージをいくつか入力すると、メッセージを入力した画面では新しいメッセージがリストに追加されますが、他方の画面にはメッセージが追加されません。</p>

<p>その状態でコンピューターのネットワークをONにするとどうでしょう。少し経って他方の画面にもメッセージが表示されるのが確認できるはずです。</p>

<div id="attachment_18109" style="width: 310px" class="wp-caption alignnone"><a href="https://html5experts.jp/wp-content/uploads/2016/01/firebasedb-1.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/01/firebasedb-1-300x120.png" alt="firebasedb" width="300" height="120" class="alignnone size-medium wp-image-18109" srcset="/wp-content/uploads/2016/01/firebasedb-1-300x120.png 300w, /wp-content/uploads/2016/01/firebasedb-1.png 640w, /wp-content/uploads/2016/01/firebasedb-1-207x83.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a><p class="wp-caption-text">ネットワークが正常</p></div>

<p>実はFirebaseデータベースの読み書きはいったんローカルDBを経由して行われています。そのためネットワーク接続が不通の場合もローカル側の処理は正常に完了し、ネットワークが回復すると自動的にデータがサーバーと同期されるのです。</p>

<div id="attachment_18110" style="width: 310px" class="wp-caption alignnone"><a href="https://html5experts.jp/wp-content/uploads/2016/01/firebasedb2-1.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/01/firebasedb2-1-300x120.png" alt="firebasedb2" width="300" height="120" class="alignnone size-medium wp-image-18110" srcset="/wp-content/uploads/2016/01/firebasedb2-1-300x120.png 300w, /wp-content/uploads/2016/01/firebasedb2-1.png 640w, /wp-content/uploads/2016/01/firebasedb2-1-207x83.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a><p class="wp-caption-text">ネットワーク異常発生</p></div>

<div id="attachment_18111" style="width: 310px" class="wp-caption alignnone"><a href="https://html5experts.jp/wp-content/uploads/2016/01/firebasedb3-1.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/01/firebasedb3-1-300x120.png" alt="firebasedb3" width="300" height="120" class="alignnone size-medium wp-image-18111" srcset="/wp-content/uploads/2016/01/firebasedb3-1-300x120.png 300w, /wp-content/uploads/2016/01/firebasedb3-1.png 640w, /wp-content/uploads/2016/01/firebasedb3-1-207x83.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a><p class="wp-caption-text">ネットワーク復旧</p></div>

<p>これによりアプリケーション開発者はネットワークの状態を一切意識することなくリアルタイムアプリケーションを作成することができます。</p>

<p>リアルタイムに状態を同期する必要がある場合、この機能だけでもFirebaseを採用する価値があるのではないかと私は思うのですが、みなさんはいかがでしょうか？</p>

<h3>データベースの内容確認</h3>

<p>サンプルアプリにメッセージをいくつか書き込んだらダッシュボードでデータベースがどうなっているか、内容を確認してみましょう。https://アプリケーションID.firebaseio.com/ にアクセスしてみてください。</p>

<div id="attachment_18115" style="width: 310px" class="wp-caption alignnone"><a href="https://html5experts.jp/wp-content/uploads/2016/01/5aaca8f4177775d53bb44e9805facbf5.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/01/5aaca8f4177775d53bb44e9805facbf5-300x229.png" alt="データベース確認" width="300" height="229" class="size-medium wp-image-18115" srcset="/wp-content/uploads/2016/01/5aaca8f4177775d53bb44e9805facbf5-300x229.png 300w, /wp-content/uploads/2016/01/5aaca8f4177775d53bb44e9805facbf5.png 640w, /wp-content/uploads/2016/01/5aaca8f4177775d53bb44e9805facbf5-207x158.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a><p class="wp-caption-text">データベース確認</p></div>

<p>ちゃんと登録されています。</p>

<p>ちなみにこのダッシュボードから値を変更することもでき、その場合ももちろんクライアント側のイベントハンドラが発火され、ブラウザ側の表示はリアルタイムに変更されます。</p>

<h3>デプロイ</h3>

<p>最後に、今回のアプリケーションをFirebaseにデプロイして実際に利用できるようにします。firebase initコマンドを実行したディレクトリでfirebase deployコマンドを実行してください。</p>

<p></p><pre class="crayon-plain-tag">% firebase deploy

=== Deploying to 'my-first-chat-app'...

i  deploying hosting
i  preparing public directory for upload...
✔  1 files uploaded successfully

✔  Deploy complete!

URL: https://my-first-chat-app.firebaseapp.com/
Dashboard: https://my-first-chat-app.firebaseio.com/

Visit the URL above or run firebase open</pre><p></p>

<p>では、ブラウザで <a href="https://my-first-chat-app.firebaseapp.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">https://my-first-chat-app.firebaseapp.com/</a> を開いてみましょう。開発時と同じデータベースを参照しているので先ほど入力したメッセージがここでも表示されています。</p>

<p>ちなみにアプリのドメインは firebaseapp.com で、ダッシュボードのドメインは firebaseio.com です。うっかり打ち間違えないように気をつけましょう。</p>

<h2>まとめ</h2>

<p>いかがでしょう。Firebaseを使用すれば非常に簡単にリアルタイムアプリケーションが作成できるということが分かっていただけたのではないでしょうか。</p>

<p>今回はFirebaseの全体的な機能の概要を説明しました。次回はもう少し複雑なアプリケーションを作りながら、Firebaseのそれぞれの機能をより詳細に掘り下げていきたいと思います。お楽しみに。</p>
]]></content:encoded>
			</item>
	</channel>
</rss>
