本日の 1.0 へのアップデートは、ネイティブのモバイル環境を主眼に置いたものですが、ウェブ版のプロジェクトもここ半年でいくつかのアップデートが行われています。パフォーマンスとテストは大きく改善されており、構造的な API が追加され、モバイルウェブでのタッチ機能のサポートも改善されています。さらに、Internet Explorer と Edge のサポートも強化され、IE10 以上で Blockly が完全にサポートされています。

また、クロス プラットフォーム開発を容易にするために、さまざまな作業も行われています。ブロックはすべて JSON で定義できるようになったので、1 つのブロック定義をウェブ、iOS、Android で使い回すことができます。これら 3 つのプラットフォームの詳細については、ドキュメントをご覧ください。


iOS コードラボは、すぐにご利用いただけます(Android 版も近日中に提供予定)。Blockly の詳細については、上の紹介ビデオデベロッパー サイトをご覧ください。また、メーリング リストにもご参加ください。ウェブAndroidiOS のコードを直接参照することもできます。



Reviewed by Takuo Suzuki - Developer Relations Team

Particle プラットフォーム上に構築されたWi-Fi 対応製品は、位置情報に基づいてその設定を自動化する機能も提供します。Geolocation API を使用することで位置情報に応じて、タイムゾーンの設定や、利用可能な周波数帯域の調整、地域ごとのサービス プロバイダへの接続などを自動的に行います。これにより、製品の設定作業はシームレスになり、操作性も向上し、有用な分析も可能になります。

たとえば、窓のブラインドの場合、位置情報をもとに日照時間のデータを参照して、その開閉を制御することで室内の温度を調整することができます。また、位置情報を送信する機能がついたコーヒー メーカーの場合、その位置情報から市場浸透率やターゲット層の詳細などマーケット分析に必要な情報を得ることもできます。

Particle 端末で位置情報を有効にする方法は、こちらのドキュメントを参照ください。必要な基本ステップは次の 4 つです。

  1. 位置情報に対して有効な Google Maps API キーを取得する
  2. Particle 端末に Google マップのファームウェアを書き込む
  3. Particle Console で Google Maps Integration を有効にする
  4. テストする

Google と Particle の詳細は、デベロッパー ドキュメントをご覧ください。


Reviewed by 丸山 智康 (Tomoyasu Maruyama) - Google Customer Engineer Lead, Japan and APAC


Screen Shot 2017-06-08 at 8.57.03 AM.png
Google.com における First Paint と First Contentful Paint の瞬間の画像。Google I/O 2017 の「Web Performance:Leveraging the Metrics that Most Affect User Experience」より引用


CSS font-display
ダウンロード可能なウェブフォントは、より視覚的にリッチなウェブ エクスペリエンスを実現するためによく利用されます。従来の Chrome では、きれいに整った画面を確実に表示するために、指定のフォントが利用可能になるまでテキストのレンダリングを遅らせていました。しかし、通信速度が遅いとフォントをダウンロードするのに何秒もかかることがあるため、ユーザーにコンテンツが表示されるまでの時間に大幅な遅延が生じてしまいます。Chrome では現在、CSS の @font-face ディスクリプタと、対応する font-display プロパティをサポートしています。これにより、デベロッパーはフォントのダウンロード中に、Chrome でテキスト コンテンツを表示する方法とタイミングを指定することができます。

Credential Management API の改善
デベロッパーのみなさまからのフィードバックを受け、Credential Management API をすべてのサイトで利用しやすいものに改善し、保存済みパスワードにアクセスするためのカスタム fetch() を廃止しました。Chrome 60 以降、ユーザーのパスワードは PasswordCredential の一部として直接返されるようになります。

さらに、Web Authentication Working Group の取り組みに合わせ、一連の変更を加えました。たとえば、requireUserMediation を廃止し、preventSilentAccess に名称変更しています。


今回のリリースに追加されたその他の機能
  • Payment Request API がデスクトップ版の Chrome でサポートされるようになりました。 
  • Payment Request API を使用することにより、支払い機能を備えたネイティブ Android アプリで サイト上での支払い処理が行えるようになりました。 
  • オブジェクトの rest および spread プロパティが新たにサポートされ、オブジェクトの統合やシャロー クローン、さまざまな変更不能なオブジェクト パターンの作成がより簡単にできるようになりました。 
  • 新しい Web Budget API によって、プッシュ通知のパーミッションを持つサイトで有限のプッシュ メッセージを送信できるようになりました。これにより、ユーザーに通知を表示しなくても、データの同期やユーザーが他のデバイスで操作した通知の削除などのバックグラウンド処理をトリガーできます。 
  • 新しい Web Push 暗号化フォーマットがサポート対象になりました。使用可能な箇所は、PushManager.supportedContentEncodings で検出できます。 
  • PushSubscription.expirationTime が利用可能になり、定期購入の期限が切れる場合はその時期についてサイトに通知されるようになりました。 
  • パフォーマンスと予測可能性を向上させるため、scrollTouchEvents の既存機能に合わせて、pointermove イベントと mousemove イベントが AnimationFrame ごとに 1 回発行されるようになりました。 
  • CSS 疑似クラスの :focus-within が利用可能になりました。これは :focus 疑似クラスが影響を与えるあらゆる要素、および :focus の影響を受ける子孫を持つあらゆる要素に影響を与えます。 
  • CSS フレーム タイミング関数が利用可能になりました。最初から最後まですべてのフレームをまったく同じ時間表示するアニメーションにおいて、アニメーションをループさせる際に役立ちます。 
  • 編集アクションの検出方法が改良されました。InputEvent によってユーザー入力をスクリプトで管理できるようになり、さらに充実した詳細情報が編集可能な要素に提供されます。 
  • セキュリティ向上のため、ユーザーがサイトを離れる際にトリガーされる BeforeUnload ダイアログは、その表示を試みるフレームがユーザーの操作やインタラクションを取得したことがある場合にのみ表示されるようになりした。ただし、これとは別に BeforeUnloadEvent は引き続きディスパッチされます。 
  • ロイヤリティ フリーのオープンな動画コーディング フォーマットである VP9 が、MP4(ISO BMFF)コンテナと一緒に使用できるようになり、以下の新しい VP9 文字列フォーマットが必要になりました。 
  • 新しい VP9 文字列フォーマットが利用可能になり、さまざまなメディア関連 API で受け付けられるようになりました。そのため、デベロッパーは動画コーデックとしては一般的であるものの未公開のエンコード プロパティを記述することができます。

サポートの終了と相互運用性の改善
  • getElementsByTagName() は、DOM 仕様のアップデートに伴い、修飾名を受け付けるようになりました。 
  • /deep/ は、事実上は操作不能な子孫コンビネータとして動作するようになりました。 
  • ユーザー エクスペリエンスの向上のためNavigator.vibrate() を呼び出すと、ユーザーがフレームまたは組み込まれたフレームを明示的にタップしていない場合は、即座に false が返されるようになりました。これは既存のクロスオリジン iframe の動作と一致しています。 
  • WEBKIT_KEYFRAME_RULEWEBKIT_KEYFRAMES_RULE は削除され、接頭辞のない標準 API、KEYFRAME_RULEKEYFRAMES_RULE に置き換えられました。 
  • 非標準の WebKitAnimationEventWebKitTransitionEvent は、document.createEvent() のサポート対象外になりました。 
  • 仕様に準拠するため、NodeIterator.filterTreeWalker.filter は JavaScript オブジェクトをラップしなくなりました。また、.prototypewindow.NodeFilter から削除されました。 
  • RTCPeerConnection.getStreamById() が削除されました。代わりに polyfill を使用することをお勧めします。 
  • SVGPathElement.getPathSegAtLength()SVGPathElement 仕様から削除されたため、サポートを終了しました。 
  • Headers.prototype.getAll() は仕様から削除されたため、Fetch API から削除されました。 



現在までに、10 億以上のユーザーが reCAPTCHA のメリットを受けています。私たちはこの保護の改善に引き続き取り組んでゆきます。

reCAPTCHA は、あらゆる場所にいるオンラインのユーザーを保護します。モバイル端末の利用が急速に拡大する中で重要になるのは、モバイルアプリとそのデータを安全に保つことです。reCAPTCHA が 10 歳の誕生日を迎える本日、最初の reCAPTCHA Android API が Google Play Services の一部としてリリースされたことをお知らせします。

この API を使うと、reCAPTCHA による人間とボットの区別の精度が上がり、モバイル ユーザーの操作性を向上させることができます。これは最新の Invisible reCAPTCHA テクノロジーを利用したもので、裏でリスク分析を行うことによって、ほとんどの人間のユーザーはクリックなしで通過できるようになっています。そのため、モバイル ユーザーは中断されることなくアプリを楽しむことができます。スパムや不正使用に悩まされることがない点は変わりません。

reCAPTCHA Android API は、モバイルアプリを保護する端末認証、セーフ ブラウジングなどのサービスを提供する Google SafetyNet の一部です。モバイル デベロッパーは、同じ API で端末とユーザーの両方を認証できるので、さらに効率的にアプリのセキュリティ リスクを低減できます。また、Android のセキュリティ保護の多様性も向上し、有害な可能性があるアプリを監視する Google Play Protect、端末の暗号化、通常のセキュリティ アップデートにこの機能が加わることになります。reCAPTCHA Android API を組み込む方法については、こちらのサイトをご覧ください。また、iOS 版のライブラリにもご期待ください。

reCAPTCHA の旅はまだ続きます。私たちは、(ボットを除く)誰もがインターネットを安全かつ簡単に使えるようにすることに取り組んでゆきます。



Reviewed by Takeshi Hagikura - Developer Relations Team

ツールとアプリの見つけやすさの向上

以上のような新機能では、今まで以上に基本を理解することが重要になります。また、言うまでもなく、優れたツールや人目に触れやすくすることはもっとも重要です。


そこで、デベロッパー エクスペリエンスの向上のため、本日、新しいデベロッパー コンソールをリリースしました。このコンソールにより、デベロッパーがチームで作業し、アプリの使用状況、パフォーマンス、ユーザー検出パターンに基づくデータの収集ができるようになります。これは、Firebase コンソールと Google Cloud コンソールを統合して、アプリ内のデータを共有できるようにしたものです。


さらに、新たなアプリのディレクトリもリリースします。ユーザーは Google Assistant を 1 回タップするだけでこの機能にアクセスでき、カテゴリやユーザーの評価を確認できます。各アプリのディレクトリ ページはウェブでも共有できるので、新しいユーザーや既存のユーザーにアプリを宣伝したり、ユーザーが友だちと共有したりできます。


今回のアップデートによって、ユーザーはアプリのショートカットを作成できるようになります。そのため、ユーザーは「OK Google、Forecaster Joe にアウターバンクスの波の様子を聞いてくれ」と言わなくても、たとえば「OK Google、波は来てるかい?」とパーソナル ショートカットを声に出すだけで簡単にアプリに戻ることができます。


こういった機能によって確かにユーザーはアプリを見つけやすくなるはずですが、私たちの仕事はこれで終わりではありません。今後も、さらに新機能を追加し、アプリを見つけやすくしてゆく予定です。

Assistant SDK のアップデート

先月、Google Assistant SDK のプレビュー版を紹介しました。これは現在も改善が続けられており、たくさんの新機能が追加されています。


ホットワードがサポートされたので、デベロッパーはボタンなどの物理的な操作ではなく、「OK Google」をトリガーとする端末を構築できるようになります。また、タイマーとアラームの機能も追加されているので、ビルトインで Google Assistant が組み込まれている端末に「OK Google、60 秒のタイマーを設定してくれ」と言うことができるようになります。


この SDK とプラットフォームは生まれて間もないものですが、今まで以上に包括的なデベロッパー エクスペリエンスを提供できるように作業を続けています。また、Google Assistant SDK を搭載したものも含め、新しい端末にこのプラットフォームを提供することも検討中です。



新しいデベロッパー コンテストのお知らせ

最後に重要なお知らせです。初めての Actions on Google デベロッパー コンテストが開催されることになりました。このコンテストでは、優秀な Google Assistant アプリに 20 以上の賞が贈られる予定です。早速開発を始めましょう。皆さんのアプリを見るのが待ちきれません。


今後も、皆さんとともに新しい Google Assistant アプリを開発できることを楽しみにしています。


Reviewed by Takuo Suzuki - Developer Relations Team

URL を利用する理由

ユーザーが何か目的を達成したいときに、地図が重要なことがあります。しかし、地図がアプリやサイトの中で重要なサービスではないこともあります。特定の場所を示すなど、ユーザーが移動する際の手助けになれば十分というときもあるでしょう。買い物をするために皆さんのもとに訪れようとしているお客様が付近の店舗を探したい場合や、他のユーザーとどこで待ち合わせするかを決めようとしている場合ということもあるでしょう。こうした状況に、Google マップは簡単に対応することができます。

Google Maps URL を使うことによって、 Google マップにリンクし、必要とする機能を自動的に呼び出すことができます。この Google Maps URL は新しい機能というわけではありません。あるプラットフォームでは、ブラウザの URL をコピーすることで動作することに気づいている方もいることでしょう。Android のアクティビティの起動を司るインテントや iOS の URL スキームも利用できます。しかし、これはネイティブ プラットフォームでしか動作しません。デベロッパーの作業も増えますし、マルチユーザー機能は同じプラットフォームのユーザーに制限されます。

クロスプラットフォーム

そこで必要になるのが、Android、iOS、ウェブのすべてをサポートするクロスプラットフォームのユニバーサル URL スキームです。たとえば、メッセージング アプリのユーザーは、メッセージの受信者が Android か iOS かを気にすること無く、友人と会う場所を共有したいはずです。同様に、デベロッパーも同じ機能を 2 つの異なるライブラリで再実装したいとは思わないはずです。

Google Maps URL を開くと、ユーザーの端末の種類に関わらず、インストールされている Google マップのアプリがそれを処理することになります。Android や iOS の Google マップが利用できる場合、それが開きます。そうでない場合は、ブラウザで Google マップが開きます。

利用は簡単

この機能は簡単に利用できます。実施したいことに沿って、URL のいくつかの値を置き換えるだけなので、プログラムで URL を作成するのも簡単です。いくつか例を示します。

予約した宿泊先へ行く方法を知りたい場合や、近隣の飲食店を探したい場合は、次のようにURLを定義します。
https://www.google.com/maps/search/?api=1&query=sushi+near+94043
query パラメータにクエリを指定します。ここでは特定の場所を指定していますが、場所を指定しない場合は、リンクをクリックしたユーザーの近くの場所で探します。ここをクリックすると近くの寿司店を探すことができますので、お試しください。

次のリンクは先ほどのクエリに似ていますが、 1 つの結果だけを返し、ページに追加情報が表示されます。
google.com/maps/search/?api=1&query=shoreline+amphitheatre
api パラメータ(必須)には、使用する Google Maps URL のバージョンを指定します。現在リリースされているバージョンは 1 です。


フィットネス アプリを設定したユーザーが自転車で新しいルートを走ってみたい場合は、次のようにします。
www.google.com/maps/dir/?api=1&destination=stevens+creek+trail&travelmode=bicycling&dir_action=navigate
ここでは、travelmode(移動モード)に bicycling(自転車)を、destination(行き先)に自転車専用道路を指定します。

また、実際にどんな場所かを確かめるために、直接ストリート ビューを開くこともできます。
www.google.com/maps/@?api=1&map_action=pano&viewpoint=36.0665,-112.0906&heading=85&pitch=10&fov=75
viewpoint(視点)パラメータには、表示したい場所の緯度経度を指定します。また、heading(方角)、pitch(上下の角度)、fov(視野角)パラメータで見る方向を指定します。

機能の詳細

Google Maps URL を活用すると、Google マップで何らかのタスクを実行するユーザーをサポートできます。しかし、もっと柔軟な対応が必要な場合や、カスタマイズや制御が必要な場合には、さらに強力な Google Maps API を活用して、Google マップをアプリやサイトに組み込む方法をおすすめします。API が提供する豊富な機能を使うことによって、カメラの制御マップへの図形の描画マップのスタイル設定などのさまざまな機能にアクセスできます。さらに、マップだけでなく、場所のメタデータやイメージなどを活用することもできます。

詳しい情報は

皆さんのニーズを満たすため、Google マップを使ったアプリで大変な作業を簡単に済ませたいという方は、ぜひ Google Maps URL をお使いください。詳細は、新しいドキュメントをご覧ください。

Google Maps URL と Google Maps APIs を利用していただき、ありがとうございます!フィードバックや問題点は、Issue Tracker で共有してください。


Posted by 丸山 智康 (Tomoyasu Maruyama) - Google Customer Engineer Lead, Japan and APAC
Share on Twitter Share on Facebook


compile "com.google.firebase:firebase-dynamic-links:11.0.0"

これによって、Dynamic Link から起動したアクティビティを開く際の処理が簡単になります。

FirebaseDynamicLinks.getInstance().getDynamicLink(getIntent())
  .addOnSuccessListener(
    new OnSuccessListener() {
      @Override
      public void onSuccess(PendingDynamicLinkData data) {
      if (data == null || data.getLink() == null) {
        // FDL は特にない。何もする必要がない
        return;
      }

      Intent launchIntent = data.getUpdateAppIntent(MainActivity.this);
      if (launchIntent != null) {
        startActivity(launchIntent); // アップグレード フローを起動する
      }

     Uri deepLink = dynamicLink.getLink();
     String myAppItemId = deepLink.getQueryParameter("myAppItemId");
     // TODO: myAppItemId のコンテンツを表示する
    }
});

新しい API に関するご質問やフィードバックがあった場合は、サポートページをご確認ください


Reviewed by Oscar Rodríguez - Developer Relations Team
Share on Twitter Share on Facebook

この動画を最後まで見ていただければ、Team Drives の機能をアプリに組み込む際の次のような基本操作について理解できるでしょう。
  1. Team Drives の作成方法 
  2. Team Drives にメンバーやユーザーを追加する方法 
  3. Team Drives でフォルダを作成する方法(通常の Drive フォルダと同様) 
  4. Team Drives フォルダにファイルをアップロードまたはインポートする方法(通常のフォルダへのファイルのアップロードと同様) 
Drive API は、さまざまなデベロッパーが Google Drive と Team Drives の両方と連携するソリューションを作成するために役立ちます。独立ソフトウェア ベンダー(ISV)の方でも、システム インテグレーター(SI)や IT 従事者の方でも、生産性向上、企業の G Suite への移行サポート、ワークフローを自動化するツールの開発など、さまざまな用途に Drive API を利用できます。

Team Drives 機能では、Drive API v2 と v3 の両方を利用できます。さらに詳しい説明は、Drive API ドキュメントをご覧ください。皆さんが Team Drives を使って作るアプリを楽しみにしています。


Reviewed by Eiji Kitamura - Developer Relations Team
Share on Twitter Share on Facebook

Share on Twitter Share on Facebook


Reviewed by Yoshifumi Yamaguchi - Developer Relations Team
Share on Twitter Share on Facebook


作業を行ったり、フィードバックを寄せてくださっている AMP 開発コミュニティの方々に感謝いたします。いつものように、問題や機能リクエストがありましたら遠慮なくお知らせください。  
 
Reviewed by Yoshifumi Yamaguchi - Developer Relations Team
Share on Twitter Share on Facebook

Posted by Hak Matsuda - Developer Relations Team
Share on Twitter Share on Facebook

ユーザーが別のタスクを実行しながらアプリを使えるようにするピクチャ イン ピクチャモード(上)。ユーザーのアプリ利用率を向上させ、直接アプリの中心機能にジャンプできるようにする通知ドット(下)。

Developer Preview 3 を使ってみる


本日のプレビュー アップデートには、最新版の Android O プラットフォームが含まれています。これは API レベル 26 の最終版で、たくさんのバグの修正や最適化が行われています。最終となる API 26 SDK は、Android Studio の SDK Manager からダウンロードできます。また、Android Support Library 26.0.0 ベータ 2 は Google の Maven レポジトリからダウンロードできます。

これらには、公式な Android O API に対応したアプリを開発およびテストするために必要な機能がすべて備わっています。最終版の SDK をインストールすると、プロジェクトの compileSdkVersion を API 26 にアップデートして公式 Android O API でコンパイルできるようになります。また、アプリの targetSdkVersion を API 26 に更新して、オプトインし、Android O に固有の動作の変更についてアプリをテストすることをおすすめします。Android O でビルドするための環境設定の詳しい手順については、移行ガイドをご覧ください。

API は 2 回目のデベロッパー プレビューから変更されています。既存のコードで Android O プレビュー API を利用している方は、差分レポートでコードに影響が出る可能性がある場所を確認してください。

Android O 向けに開発を行っている方は、Canary チャンネルから利用できる最新版の Android Studio 3.0 にアップデートすることをおすすめします。Android Studio 3.0 では、アプリのパフォーマンス プロファイリング ツールの改善、Kotlin プログラミング言語のサポート、Gradle ビルドの最適化などの新機能だけでなく、Instant Apps ビルドのサポート、アダプティブ アイコン ウィザードXML フォントダウンロード可能フォントのサポートも利用できます。
Android Studio 3.0 には、アプリの XML フォント リソースをプレビューできる Android O の機能を使って開発するためのツールが含まれています。

こういった機能を使う予定がない方は、Android O 安定版チャンネルの Android Studio 2.3.3 を使って開発することもできます。ただし、アダプティブ アイコン、ダウンロード可能フォント、XML フォント関連の作業を行うツールは、Android Studio 2.3.3 では利用できない点に注意してください。

Google Play のアルファ版、ベータ版、または製品版チャンネルにアプリを公開する


API は最終版なので、API 26 を使用しコンパイル(オプションで、API 26 をターゲットに指定することもできます)した APK のアップデートを、Google Play のアルファ版、ベータ版、または製品版チャンネルに公開できます。プレビュー期間中に O をターゲットにしたアプリを公開すると、Android ベータ版プログラムに登録しているユーザーなどを対象に、既存の端末での互換性のテストや API 26 を実行している端末へのアップデートの送信を行うことができます。

アップデートしたアプリが Android O だけでなく旧バージョンでも動作することを確かめるには、通常、Google Play のベータ版テスト機能を使って、デベロッパー プレビューのユーザーを含む少人数のユーザーから初期段階でのフィードバックを入手し、その後、アップデートしたアプリを段階的にユーザー全員にリリースします。

プレビュー アップデートの入手方法


Developer Preview 3 は、近日中に Android ベータ版プログラムを通して世界中のデベロッパーやアーリー アダプターに配信されます。まだ登録していない方は、android.com/beta にアクセスして、対象の Android スマートフォンまたはタブレットをオプトインしてください。通常どおり、このアップデートを手動でダウンロードして端末に書き込むこともできます。O Developer Preview は、Pixel、Pixel XL、Pixel C、Nexus 5X、Nexus 6P、Nexus Player で利用いただけます。

いつもフィードバックにご協力いただき、ありがとうございます。今夏の終わり頃に予定している正式リリースに向けて努力してまいりますので、今後もフィードバックやリクエストをお寄せください。Android O に対応した皆さんのアプリを楽しみにしています。



Posted by Yuichi Araki - Developer Relations Team
Share on Twitter Share on Facebook


画像の無害化では、アダルト コンテンツや暴力的なコンテンツにぼかしをかけます。  

本質的に、自動的な無害化は信頼できる環境(つまり、クライアント以外)で行う必要があります。そのため、Cloud Functions for Firebase はまさに適任です。2 種類の無害化を行うには、2 つの機能が必要です。  
 

テキストの無害化


テキストの無害化では、Firebase Realtime Database をトリガーとして moderator という名前の機能を実行します。ユーザーが Realtime Database に新しくコメントや投稿を追加すると、bad-words npm パッケージを使って汚い言葉を削除する機能が実行されます。続いて、capitalize-sentence npm パッケージを使って、大文字が多用されているメッセージ(通常は、ユーザーによるシャウト)を小文字に修正します。最後のステップでは、無害化したメッセージを Realtime Database に書き戻します。  
 
実例として、ユーザーがチャットルームに書き込んだメッセージのリストを表す単純なデータ構造を考えてみましょう。メッセージは 1 つの text 属性を含むオブジェクトで、/messages リストに格納されています。  
 
/functions-project-12345
   /messages
       /key-123456
           text: "This is my first message!"
       /key-123457
           text: "IN THIS MESSAGE I AM SHOUTING!!!"

新しく追加されたメッセージに対して機能が実行されると、2 つの属性が追加されます。無害化機能によってメッセージが検証された際に true になる sanitized 属性と、メッセージで不適切なコンテンツが検知され、修正された場合に true になる moderated 属性です。たとえば、上の 2 つのメッセージに対して無害化機能が実行されると、次のようになります。  
/functions-project-12345
   /messages
       /key-123456
           text: "This is my first message!",
           sanitized: true,
           moderated: false
       /key-123457
           text: "In this message I am shouting."
           sanitized: true,
           moderated: true

 
moderator 機能は、メッセージが書き込まれるたびに実行されます。これは、functions.database().path('/messages/{messageId}').onWrite(...) トリガールールを使用して設定します。ここでは、メッセージを無害化し、そのメッセージを Realtime Database に書き戻しています。
exports.moderator = functions.database.ref('/messages/{messageId}')
  .onWrite(event => {
      const message = event.data.val();

      if (message && !message.sanitized) {
        // Retrieved the message values.
        console.log('Retrieved message content: ', message);

        // Run moderation checks on on the message and moderate if needed.
        const moderatedMessage = moderateMessage(message.text);

        // Update the Firebase DB with checked message.
        console.log('Message has been moderated. Saving to DB: ', moderatedMessage);
        return event.data.adminRef.update({
          text: moderatedMessage,
          sanitized: true,
          moderated: message.text !== moderatedMessage
        });
      }
    });

 
moderateMessage 関数では、まずユーザーがシャウトしているかどうかをチェックし、シャウトしている場合は文を小文字に変換します。次に、bad-words パッケージ フィルタを使って汚い言葉をすべて削除します。  
 
function moderateMessage(message) {
  // Re-capitalize if the user is Shouting.
  if (isShouting(message)) {
    console.log('User is shouting. Fixing sentence case...');
    message = stopShouting(message);
  }

  // Moderate if the user uses SwearWords.
  if (containsSwearwords(message)) {
    console.log('User is swearing. moderating...');
    message = moderateSwearwords(message);
  }

  return message;
}

// Returns true if the string contains swearwords.
function containsSwearwords(message) {
  return message !== badWordsFilter.clean(message);
}

// Hide all swearwords. e.g: Crap => ****.
function moderateSwearwords(message) {
  return badWordsFilter.clean(message);
}

// Detect if the current message is shouting. i.e. there are too many Uppercase
// characters or exclamation points.
function isShouting(message) {
  return message.replace(/[^A-Z]/g, '').length > message.length / 2 || message.replace(/[^!]/g, '').length >= 3;
}

// Correctly capitalize the string as a sentence (e.g. uppercase after dots)
// and remove exclamation points.
function stopShouting(message) {
  return capitalizeSentence(message.toLowerCase()).replace(/!+/g, '.');
}

注: bad-words パッケージは badwords-list パッケージの汚い言葉のリストを使いますが、これには 400 個の言葉しか含まれていません。ご存じのように、ユーザーの想像力は無制限なので、これはすべてを網羅したリストではありません。そのため、汚い言葉の辞書を拡張する必要があるかもしれません。  
 

画像の無害化


画像の無害化を行うために、Cloud Storage にファイルがアップロードされるたびに実行される blurOffensiveImages 機能を設定します。これは、functions.cloud.storage().onChange(...) トリガールールを使用して設定します。ここでは、Google Cloud Vision API を使って画像に暴力的なコンテンツやアダルト コンテンツが含まれているかをチェックしています。Cloud Vision API には、画像内の不適切なコンテンツを検知することに特化した機能があります。画像が不適切だった場合は、画像にぼかしをかけます。  
exports.blurOffensiveImages = functions.storage.object().onChange(event => {
  const object = event.data;
  const file = gcs.bucket(object.bucket).file(object.name);

  // Exit if this is a move or deletion event.
  if (object.resourceState === 'not_exists') {
    return console.log('This is a deletion event.');
  }

  // Check the image content using the Cloud Vision API.
  return vision.detectSafeSearch(file).then(data => {
    const safeSearch = data[0];
    console.log('SafeSearch results on image', safeSearch);

    if (safeSearch.adult || safeSearch.violence) {
      return blurImage(object.name, object.bucket, object.metadata);
    }
  });
});

Cloud Storage に格納されている画像をぼかすには、まず Cloud Functions インスタンスのローカルに画像をダウンロードします。そして、ImageMagick で画像をぼかし、Cloud Storage に再アップロードします。ImageMagick はすべてのインスタンスにデフォルトでインストールされています。  
 
function blurImage(filePath, bucketName, metadata) {
 const filePathSplit = filePath.split('/');
 filePathSplit.pop();
 const fileDir = filePathSplit.join('/');
 const tempLocalDir = `${LOCAL_TMP_FOLDER}${fileDir}`;
 const tempLocalFile = `${LOCAL_TMP_FOLDER}${filePath}`;
 const bucket = gcs.bucket(bucketName);

 // Create the temp directory where the storage file will be downloaded.
 return mkdirp(tempLocalDir).then(() => {
   console.log('Temporary directory has been created', tempLocalDir);
   // Download file from bucket.
   return bucket.file(filePath).download({
     destination: tempLocalFile
   });
 }).then(() => {
   console.log('The file has been downloaded to', tempLocalFile);
   // Blur the image using ImageMagick.
   return exec(`convert ${tempLocalFile} -channel RGBA -blur 0x8 ${tempLocalFile}`);
 }).then(() => {
   console.log('Blurred image created at', tempLocalFile);
   // Uploading the Blurred image.
   return bucket.upload(tempLocalFile, {
     destination: filePath,
     metadata: {metadata: metadata} // Keeping custom metadata.
   });
 }).then(() => {
   console.log('Blurred image uploaded to Storage at', filePath);
 });
}

 
Cloud Functions for Firebase は、ユーザーの操作に応答して自動的に無害化ルールを適用できる優れたツールです。テキストの無害化画像の無害化のサンプルはオープンソースです。自由にご覧ください。  
 
Posted by Khanh LeViet - Developer Relations Team
Share on Twitter Share on Facebook


さらに詳しく知りたい方のために、以下にプレゼンテーションの概要をまとめました。

App Maker で企業の「アプリのギャップ」を埋める 

多くの企業が、実際に「アプリのギャップ」に悩まされています。この点は、主要な SaaS 製品を導入している企業も変わりありません。テリトリープランニングやアセットのパフォーマンス トラッキングなど、標準 CRM では対応できない極端な例を考えてみるとよいでしょう。

Google も、同じギャップを経験しました。数年前、人材募集担当者は月に何千名も面接して、複数の面接官が長いフィードバックを作成していました。あまりに膨大な量だったため、採用委員会が候補者を精査してタイムリーな判断を行うのは難しく、対応が遅れていました。この問題を解決するため、IT チームが自社インフラのさまざまな要素を活用してアプリを作成することにしました。

やがて、他の部門からもアプリを作ってほしいという要望が寄せられたため、App Maker を作成しました。そして、Google 社内の数個のアプリから始まったこの仕組みは、数千名が利用する 400 近い内部アプリに進化したのです。さらに、こういったアプリの大半は、IT 部門以外のエンジニアでない人々が構築したものです。

現在では、App Maker を使って、ソフトウェア エンジニアや専門家以外のデベロッパー(ビジネス アナリスト、コーディング愛好家など)がアプリをすばやく構築して導入し、ワークフローの課題を解消できるようになりました。

機能の仕組み 

App Maker を使うと、簡単にデータ バインディングを行い、ドラッグ アンド ドロップで UI を設計できるため、数か月どころか数日でアプリを構築できます。アプリには、さまざまなデータソース、Google のサービスや API を組み込むことができるので、以前の資産も活用できます。作成したすべてのアプリは G Suite のドライブの一部になるので、データがドメインの外に出ることはありません。

App Maker アプリは、次の 3 段階で作成できます。
  1. データモデルを定義します。これは、既存の Google スプレッドシートを App Maker にインポートする、Google Cloud SQL インスタンスに接続する、フィールドごとにカスタム オブジェクトを手動で定義する、のいずれかの方法で行います。
  2. UI を構築します。それには、データ入力フォームなどのビルド済みのコンポーネントやレポート テンプレートを追加します。イベント トリガーやアプリのフローも簡単に作成できます。 
  3. オプションで、クライアント UI やアプリサーバーで実行されるオープンソースの HTML、CSS、JavaScript を追加し、そのままでは提供されないカスタム機能を実装します。
現在、App Maker はアーリー アダプター プログラム(EAP)となっており、G Suite Business のユーザー全員が利用できます。使ってみたい方は、こちらから申請してください

考えられる活用事例 

どのようなものを作ることができるのか、よくわからないという方もいらっしゃるでしょう。以下に、ユーザーの事例に基づいたいくつかの着手点を紹介します。
G Suite の App Maker で独自のアプリを作成しましょう。早速 EAP にお申し込みください



Posted by Eiji Kitamura - Developer Relations Team
Share on Twitter Share on Facebook



Posted by Takuo Suzuki - Developer Relations Team
Share on Twitter Share on Facebook


ユーザーが正しいコードを入力すると、Firebase がそれを確認し、ユーザーとして認識します。以降のセッションでは、ログイン状態が維持されます。  
ログイン済みのユーザーは、Firebase コンソールで次のように表示されます。  

Firebase Authentication の詳細は、Firebase デベロッパー サイトをご覧ください。  
Firebase UI は、ログインやユーザー登録のフローのベスト プラクティスをすばやく簡単に実装できるオープンソース ライブラリです。現在、Firebase UI の電話番号認証は iOSウェブで利用できます。近日中に Android にも対応する予定です。  
Firebase と Firebase Authentication の拡大と開発は今後も続いていきます。皆さんのフィードバックをお待ちしていますので、ぜひ firebase.google.com/support までご連絡ください。  

Reviewed by Khanh LeViet - Developer Relations Team
Share on Twitter Share on Facebook



Firebase Performance Monitoring には、トレースとネットワーク アクティビティ監視という 2 つの主な機能があります。まずは、トレースについて説明しましょう。トレース機能を使うと、アプリの特定の操作にかかる時間を把握したり、「カウンター」API を使って操作にカスタムの指標を追加できます。たとえば、イメージの読み込みが始まってから画面でイメージのレンダリングが終わるまでの時間をトレースしたり、カウンターを使ってイメージ読み込み時のキャッシュのヒット回数やミス回数をトラッキングすることができます。

アプリの起動は SDK をインストールするだけで自動でトレースできるので、アプリのコールド スタートにかかる時間を監視できます。


Firebase Performance が提供するもう 1 つの機能は、ネットワーク アクティビティの監視です。アプリが実行する HTTP/S リクエストは、送信されてから応答を受信するまで、自動的に監視されます。URL のパターンごとに、応答時間、ペイロード サイズ、成功率を確認できます。


リクエストに失敗した場合は、原因となったレスポンス コードについて 400 番台と 500 番台の内訳を確認できます。



収集されるトレースおよびネットワーク関連の全指標では、国、端末、アプリのバージョン、OS のバージョンの内訳を確認できます。これによって問題の原因を絞り込めるので、修正が簡単になります。



現在、Firebase Performance Monitoring はベータ版として公開されています。詳しくはこちらのドキュメントまたは I/O セッションをご覧ください。



Reviewed by Khanh LeViet - Developer Relations Team
Share on Twitter Share on Facebook