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
この記事は Google Maps API プロダクト マネージャー、Joel Kalmanowicz による Google Geo Developers Blog の記事 "Get your users where they need to go on any platform with Google Maps URLs " を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
Google I/O 2017 でご紹介した「Google Maps URL」は、任意のアプリから Google マップに直接リンクすることができる新たな方法です。毎月 10 億人以上のユーザーが Google マップのアプリやサイトを利用して世界中の情報にアクセスしています。今回発表した仕組みによって、任意のアプリやサイトから Google マップを簡単に活用することができます。
VIDEO
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
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
この記事は プロダクト マネージャー 、 Jumana Al Hashal による The Firebase Blog の記事 "Making Dynamic Links Easier " を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
Firebase Dynamic Links は便利なリンクシステムです。1 つだけのリンクで、インストール済みの iOS や Android アプリを開き、ディープリンクを使用し、ユーザーが探しているコンテンツを直接にアプリ内で表示することができます。アプリがインストールされていない場合にも、同じリンクで App Store や Google Play のアプリのページからアプリ内のコンテンツまで案内することができます。
私たちは 1 年前からこの機能を改善し、よりスムーズでよりパワフルな体験をデベロッパー、ユーザーの両方に届けられるよう努力してきました。今回、最新の機能を iOS SDK と Android SDK に届けることができたことを嬉しく思います。
Dynamic Links をダイナミックに生成する
今まで、Dynamic Links を生成するには Firebase コンソールからアクセスする必要がありました。広告、宣伝などのキャンペーンの目的では十分でしたが、デベロッパーの皆さまからは、ユーザー同士で共有できるキャンペーンなどに対応するために、アプリからリンクを作成できるようにしたいというフィードバックを多数いただいていました。
そのため、iOS と Android の Firebase SDK に、ロングとショートの Dynamic Link を生成する機能を追加しました。
iOS:
guard let deepLink = URL(string: "https://mydomain.com/page?param=value") else { return }
let components = DynamicLinkComponents(link: deepLink, domain: domain)
let iOSParams = DynamicLinkIOSParameters(bundleID: bundleID)
iOSParams.minimumAppVersion = minVersion
components.iOSParameters = iOSParams
// ダイナミック リンクを生成する
let link = components.url
// またはショート リンクを生成する
components.shorten { (shortURL, warnings, error) in
if let error = error {
print(error.localizedDescription)
return
}
// TODO: shortURL を使用する
}
Android:
String deepLink = "https://mydomain.com/page?param=value";
DynamicLink.Builder builder = FirebaseDynamicLinks.getInstance()
.createDynamicLink()
.setDynamicLinkDomain(domain)
.setAndroidParameters(new DynamicLink.AndroidParameters.Builder()
.setMinimumVersion(minVersion)
.build())
.setLink(deepLink);
// ダイナミック リンクを生成する
DynamicLink link = builder.buildDynamicLink();
// またはショート リンクを生成する
builder.buildShortDynamicLink()
.addOnSuccessListener(new OnSuccessListener() {
@Override
public void onSuccess(ShortDynamicLink shortDynamicLink) {
// shortDynamicLink を使用する
}
});
新しい Android API
アプリから Dynamic Links を実装しやすくするために Android API を考え直して、新たに FirebaseDynamicLinks というクラスを追加しました。新しいライブラリを追加するには、build.gradle に次の行を追加します。
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
この動画を最後まで見ていただければ、Team Drives の機能をアプリに組み込む際の次のような基本操作について理解できるでしょう。
Team Drives の作成方法
Team Drives にメンバーやユーザーを追加する方法
Team Drives でフォルダを作成する方法(通常の Drive フォルダと同様)
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
この記事は Google Drive プロダクト マネージャー、Hodie Meyers、G Suite デベロッパー アドボケート、Wesley Chun(@wescpy) による Google Apps Developer Blog の記事 "VIDEO: Part 1—Introducing Team Drives for developers " を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
エンタープライズ企業は常に効率化の方法を模索していますが、デベロッパーに正しいツールを用意することで違いを生みだすことができます。Google は今年、Team Drives をリリースしました 。これは、Google Drive でユーザーに好評だった機能を企業のチームにも提供するものです。さらに、デベロッパーが Team Drives を活用したアプリを開発できるよう、Google Drive API もアップデートしました。
この最新の G Suite Dev Show 動画では、アプリで Team Drives の機能を活用する方法について説明しています。うれしいことに、まったく新しい API を学習する必要はありません。Team Drives の機能は Drive API に組み込まれているため、これまでに身につけた知識を使って開発できます。どうぞご覧ください。
VIDEO
この動画を最後まで見ていただければ、Team Drives の機能をアプリに組み込む際の次のような基本操作について理解できるでしょう。
Team Drives の作成方法
Team Drives にメンバーやユーザーを追加する方法
Team Drives でフォルダを作成する方法(通常の Drive フォルダと同様)
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
Android Studio 3.0 には、アプリの XML フォント リソースをプレビューできる Android O の機能を使って開発するためのツールが含まれています。
画像の無害化 では、アダルト コンテンツや暴力的なコンテンツにぼかしをかけます。
本質的に、自動的な無害化は信頼できる環境(つまり、クライアント以外)で行う必要があります。そのため、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
この記事は デベロッパー プログラム エンジニア、 Nicolas Garnier による The Firebase Blog の記事 "Content Moderation with Cloud Functions for Firebase " を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
掲示板、ソーシャル ネットワーク、ブログ プラットフォームなど、ユーザーがコンテンツを投稿できるアプリでは、常に不適切なコンテンツが公開されるリスクが存在します。本投稿では、Firebase アプリで Cloud Functions を使って自動的に不適切なコンテンツを無害化する方法について紹介します。
コンテンツを無害化するもっとも一般的な戦略は、「受動的な無害化」です。通常は、ユーザーに不適切なコンテンツを報告してもらうためのリンクを追加し、ルールに従っていないコンテンツを手動で確認して削除します。しかし、受動的な無害化を補完するために自動的な無害化の仕組みを追加すると、不適切なコンテンツが公開されることを防ぐ仕組みをさらに強化できます。Cloud Functions を使うと、Firebase アプリでユーザーが公開した不適切なテキストや写真などのコンテンツに対する自動チェックを簡単に行うことができます。どのくらい簡単にできるのか、早速見てみましょう。
ここでは、2 種類の自動コンテンツ無害化を実行します。
テキストの無害化 では、汚い言葉やシャウト(「SHOUTING!!!」など、すべて大文字の言葉)をすべて削除します。
画像の無害化 では、アダルト コンテンツや暴力的なコンテンツにぼかしをかけます。
本質的に、自動的な無害化は信頼できる環境(つまり、クライアント以外)で行う必要があります。そのため、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
さらに詳しく知りたい方のために、以下にプレゼンテーションの概要をまとめました。
App Maker で企業の「アプリのギャップ」を埋める
多くの企業が、実際に「アプリのギャップ」に悩まされています。この点は、主要な SaaS 製品を導入している企業も変わりありません。テリトリープランニングやアセットのパフォーマンス トラッキングなど、標準 CRM では対応できない極端な例を考えてみるとよいでしょう。
Google も、同じギャップを経験しました。数年前、人材募集担当者は月に何千名も面接して、複数の面接官が長いフィードバックを作成していました。あまりに膨大な量だったため、採用委員会が候補者を精査してタイムリーな判断を行うのは難しく、対応が遅れていました。この問題を解決するため、IT チームが自社インフラのさまざまな要素を活用してアプリを作成することにしました。
やがて、他の部門からもアプリを作ってほしいという要望が寄せられたため、App Maker を作成しました。そして、Google 社内の数個のアプリから始まったこの仕組みは、数千名が利用する 400 近い内部アプリに進化したのです。さらに、こういったアプリの大半は、IT 部門以外のエンジニアでない人々が構築したものです。
現在では、App Maker を使って、ソフトウェア エンジニアや専門家以外のデベロッパー(ビジネス アナリスト、コーディング愛好家など)がアプリをすばやく構築して導入し、ワークフローの課題を解消できるようになりました。
機能の仕組み
App Maker を使うと、簡単にデータ バインディングを行い、ドラッグ アンド ドロップで UI を設計できるため、数か月どころか数日でアプリを構築できます。アプリには、さまざまなデータソース、Google のサービスや API を組み込むことができるので、以前の資産も活用できます。作成したすべてのアプリは G Suite のドライブの一部になるので、データがドメインの外に出ることはありません。
App Maker アプリは、次の 3 段階で作成できます。
データ モデルを定義します。これは、既存の Google スプレッドシートを App Maker にインポートする、Google Cloud SQL インスタンスに接続する、フィールドごとにカスタム オブジェクトを手動で定義する、のいずれかの方法で行います。
UI を構築します。それには、データ入力フォームなどのビルド済みのコンポーネントやレポート テンプレートを追加します。イベント トリガーやアプリのフローも簡単に作成できます。
オプションで、クライアント UI やアプリサーバーで実行されるオープンソースの HTML、CSS、JavaScript を追加し、そのままでは提供されないカスタム機能 を実装します。
現在、App Maker はアーリー アダプター プログラム(EAP)となっており、G Suite Business のユーザー全員が利用できます。使ってみたい方は、
こちらから申請してください 。
考えられる活用事例
どのようなものを作ることができるのか、よくわからないという方もいらっしゃるでしょう。以下に、ユーザーの事例に基づいたいくつかの着手点を紹介します。
比較的多くのユーザーが定期的にアップデートする大きなスプレッドシートがある場合: 通常、スプレッドシートにはその元となるワークフローがあります。App Maker アプリを使うと、よりよい UI を提供できるので、ワークフローの視覚化、アクションの確認、データ入力エラーの削減などが可能です。
カレンダーや Gmail で一括操作を何度も行っている場合: たとえば、社員が部署を異動する場合、App Maker アプリを作成して数クリックで必要な一括操作を行うことができます。
すでに Apps Script や BigQuery を利用している場合: この場合、すでにワークフローのカスタマイズに投資を行っていることになります。App Maker は、カスタムアプリ開発を加速させます。
G Suite の App Maker で独自のアプリを作成しましょう。
早速 EAP にお申し込みください 。
Posted by
Eiji Kitamura - Developer Relations Team
この記事は App Maker プロダクト マネージャー、Geva Rechav による Google Apps Developer Blog の記事 "Google I/O session recap: how to build custom apps with App Maker " を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
業務や顧客、社員に特有のワークフローやプロセスはあらゆる企業に存在します。多くの場合、そのようなワークフローやプロセスは、マクロやスクリプトとともに大きなスプレッドシートやその場しのぎのデータベースに保存されています。しかし、そういったスプレッドシートやデータベースがカスタムの業務アプリになったらどうでしょう。便利な UI やユーザー個別の役割が提供され、データの入力エラーを最小限にとどめつつ生産性を向上させるアプリがあったらどうなるでしょうか。
今年の Google I/O では、企業が App Maker を使うべき理由を説明しました。App Maker は、コードをほとんど書く必要がないアプリ開発ツールです。これを使うと、企業は G Suite でカスタムアプリをすばやく構築できます。以下をご確認ください。
VIDEO
さらに詳しく知りたい方のために、以下にプレゼンテーションの概要をまとめました。
App Maker で企業の「アプリのギャップ」を埋める
多くの企業が、実際に「アプリのギャップ」に悩まされています。この点は、主要な SaaS 製品を導入している企業も変わりありません。テリトリープランニングやアセットのパフォーマンス トラッキングなど、標準 CRM では対応できない極端な例を考えてみるとよいでしょう。
Google も、同じギャップを経験しました。数年前、人材募集担当者は月に何千名も面接して、複数の面接官が長いフィードバックを作成していました。あまりに膨大な量だったため、採用委員会が候補者を精査してタイムリーな判断を行うのは難しく、対応が遅れていました。この問題を解決するため、IT チームが自社インフラのさまざまな要素を活用してアプリを作成することにしました。
やがて、他の部門からもアプリを作ってほしいという要望が寄せられたため、App Maker を作成しました。そして、Google 社内の数個のアプリから始まったこの仕組みは、数千名が利用する 400 近い内部アプリに進化したのです。さらに、こういったアプリの大半は、IT 部門以外のエンジニアでない人々が構築したものです。
現在では、App Maker を使って、ソフトウェア エンジニアや専門家以外のデベロッパー(ビジネス アナリスト、コーディング愛好家など)がアプリをすばやく構築して導入し、ワークフローの課題を解消できるようになりました。
機能の仕組み
App Maker を使うと、簡単にデータ バインディングを行い、ドラッグ アンド ドロップで UI を設計できるため、数か月どころか数日でアプリを構築できます。アプリには、さまざまなデータソース、Google のサービスや API を組み込むことができるので、以前の資産も活用できます。作成したすべてのアプリは G Suite のドライブの一部になるので、データがドメインの外に出ることはありません。
App Maker アプリは、次の 3 段階で作成できます。
データ モデルを定義します。これは、既存の Google スプレッドシートを App Maker にインポートする、Google Cloud SQL インスタンスに接続する、フィールドごとにカスタム オブジェクトを手動で定義する、のいずれかの方法で行います。
UI を構築します。それには、データ入力フォームなどのビルド済みのコンポーネントやレポート テンプレートを追加します。イベント トリガーやアプリのフローも簡単に作成できます。
オプションで、クライアント UI やアプリサーバーで実行されるオープンソースの HTML、CSS、JavaScript を追加し、そのままでは提供されないカスタム機能 を実装します。
現在、App Maker はアーリー アダプター プログラム(EAP)となっており、G Suite Business のユーザー全員が利用できます。使ってみたい方は、こちらから申請してください 。
考えられる活用事例
どのようなものを作ることができるのか、よくわからないという方もいらっしゃるでしょう。以下に、ユーザーの事例に基づいたいくつかの着手点を紹介します。
比較的多くのユーザーが定期的にアップデートする大きなスプレッドシートがある場合: 通常、スプレッドシートにはその元となるワークフローがあります。App Maker アプリを使うと、よりよい UI を提供できるので、ワークフローの視覚化、アクションの確認、データ入力エラーの削減などが可能です。
カレンダーや Gmail で一括操作を何度も行っている場合: たとえば、社員が部署を異動する場合、App Maker アプリを作成して数クリックで必要な一括操作を行うことができます。
すでに Apps Script や BigQuery を利用している場合: この場合、すでにワークフローのカスタマイズに投資を行っていることになります。App Maker は、カスタムアプリ開発を加速させます。
G Suite の App Maker で独自のアプリを作成しましょう。早速 EAP にお申し込みください 。
Posted by Eiji Kitamura - Developer Relations Team
ユーザーが正しいコードを入力すると、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
この記事は デベロッパー アドボケート、 Laurence Moroney による The Firebase Blog の記事 "Firebase Phone Auth " を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
初めてリリースされたときから、Firebase はさまざまな認証スキームを提供しています。
ユーザーが基本情報を提供するメールとパスワード 認証(iOS 、Android 、ウェブ )を使ったアプリを構築することができます。この場合、Firebase はこれらを ID として利用し、ログインを管理します。また、フェデレーション ID を使うこともできます。この場合、ユーザーがアプリにユーザー登録するのではなく、Google 、Facebook 、Twitter 、GitHub などのサードパーティが提供する認証情報を使ってログインします。加えて、登録していないユーザーにセキュリティ ルールを提供する匿名 認証を使うこともできます。
多くのデベロッパーからリクエストされていた認証タイプに、電話番号を使ったログイン機能があります。それを受けて、本日は Firebase Auth で電話番号認証がサポートされたことをお知らせします。現在 Digits SDK を使って電話番号認証を行っている方は、Firebase Auth への移行の詳細が記載されているこちら のお知らせをご覧ください。
Firebase 電話番号認証は、次のように動作します。
ログイン画面
ここに示すのは、Google と Facebook によるフェデレーション ID、メールとパスワードによる基本認証に加えて、電話番号認証をサポートするアプリの例です。
このアプリは、FirebaseUI を使って構築されています。そのため、本記事で説明するフローの多くは、FirebaseUI を組み込むことによって自動的に実装されます。
画面の下部を見ればわかるように、電話番号でログインする [Sign in with Phone] オプションが表示されています。
では、ユーザーがこのボタンをタップするとどうなるかを詳しく見てみましょう。
ログインフロー
ユーザーは、[Sign in with Phone] ボタンを初めてタップした後、端末の電話番号を入力します。[Verify] を押すと番号が Firebase に送信され、6 桁のコードが生成されて SMS 経由で端末に送られます。
ユーザーが正しいコードを入力すると、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
VIDEO
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
この記事は プロダクト マネージャー、 Ali Abdelhadi による The Firebase Blog の記事 "Introducing Firebase Performance Monitoring " を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
優れたモバイルアプリを作成する上で、エンドユーザーの視点によるパフォーマンスの監視は大きな難題です。これは、アプリのコードのパフォーマンスにも、ネットワークの応答性や信頼性についても言えることです。ユーザーの離脱や否定的なレビューを避けるためには、どこに改善の必要があるかを把握できなければなりません。逆に、Google Play の星 5 つのレビューの 60% では、スピード、デザイン、ユーザビリティについて言及されています。
ネイティブ アプリのパフォーマンスの監視における最大の難題は、状況を把握することです。ユーザーの体感速度が遅くなったり、アニメーションがスムーズに動作しないことがわかるだけでは不十分です。そのような現象がアプリのどこで発生しているかを把握する必要があります。また、さまざまな国や端末、OS レベルなどによって現象がどのように異なるかを把握することも重要です。
これこそが、iOS と Android 向けの Firebase Performance Monitoring が開発された理由です。このツールは、本番環境でのパフォーマンス指標を取得して計測する SDK と、SDK が取得したデータを分析できるコンソールを提供します。
VIDEO
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