Quantcast
Channel: Google Developers Japan
Viewing all 2208 articles
Browse latest View live

Firebase Cloud Messaging v1 が Admin SDK から利用可能に

$
0
0
この記事はデベロッパー アドボケート、Jen Person による The Firebase Blog の記事 "Firebase Cloud Messaging v1 Now Available from the Admin SDK" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。

Firebase Cloud Messaging (FCM) は、日々数十億件のメッセージを送り続けています。そのことを考えると、いつも驚いてしまいます。FCM は、iOS、Android、ウェブのデベロッパーが通知やデータ メッセージをクライアントに送る際に欠かせないものになっています。先日、FCM がアップデートされ、セキュリティが向上して新機能が追加されました。さらに、Node.js、Python、Java、Go の Firebase Admin SDK から新しい FCM にアクセスできるようになっています。

最新版の FCM である FCM v1 には、1 つのリクエストをプラットフォームごとにオーバーライドして送信する機能が含まれています。たとえば、同じ本文のメッセージに対して、Android に通知する場合の生存時間と iOS に通知する場合の APN プライオリティをそれぞれセットすることができます。プラットフォーム オーバーライドの詳細については、ドキュメントこちらのブログ投稿を参照してください。

Firebase Admin SDK を使うと、FCM v1 API をサーバーサイド アプリケーションに簡単に組み込むことができます。Node.js で単純なデータ メッセージを送る方法を示します。
var registrationToken = 'YOUR_REGISTRATION_TOKEN';

var message = {
data: {
score: '850',
time: '2:45'
},
token: registrationToken
};

admin.messaging().send(message)
.then((response) => {
console.log('Successfully sent message:', response);
})
.catch((error) => {
console.log('Error sending message:', error);
});

このコードの Java 版、Python 版、Go 版を見たい方は、ドキュメントをご覧ください。FCM v1 ドキュメントには、すべてのメッセージ ペイロード オプションが記載されています。Admin SDK for FCM を使うと、端末やトピックにメッセージを送信するだけでなく、サーバーからトピックのサブスクリプションを管理することもできます。

Node.js でトピックをサブスクライブする例を示します。
var registrationTokens = [
'YOUR_REGISTRATION_TOKEN_1',
// ...
'YOUR_REGISTRATION_TOKEN_n'
];
admin.messaging().subscribeToTopic(registrationTokens, topic)
.then(function(response) {
console.log('Successfully subscribed to topic:', response);
})
.catch(function(error) {
console.log('Error subscribing to topic:', error);
});

このコードの Java 版、Python 版、Go 版を見たい方は、ドキュメントをご覧ください。Admin SDK のおかげで、メッセージの送信が今までになく簡単になっています。完全なドキュメントは、こちらからご覧ください。FCM を使って何かすばらしいものを作っているという方は、ぜひ @Firebase と @ThatJenPerson にツイートして私たちにお知らせください!

Reviewed by Khanh LeViet - Developer Relations Team

Gboard 物理手書きバージョンの舞台裏

$
0
0
Google 日本語入力チームは、4 月 1 日に Gboard 物理手書きバージョンを発表しました。キーボードの上に書かれた文字を識別することで、従来のキーボードの使い方に囚われない直感的な文字入力を実現します。もうこれでキーボード上のキーを探してキーとなることはありません。

この製品の裏側には、まあまあの精度の文字認識を実現する機械学習技術が活用されています。下図に、今回構築した機械学習システムの概要を示します。本記事では Gboard 物理手書きバージョンに利用されている機械学習技術について、「機械学習モデルの構築」「ハードウェアでの推論」「ブラウザでの推論」と順を追って紹介していきます。

システムの概要図


機械学習モデルの構築


訓練データの収集


今回私たちが立ち向かうタスクは、入力されたキーのシーケンスからユーザーが意図する文字を予測することです。オンライン手書き文字認識に似たタスクではあるものの、その多くはペンタブレットやタッチスクリーンでの入力を前提としています。そのため、キーボードのように低解像度の入力に対応した機械学習モデルを構築するためには、一から訓練データを収集する必要がありました。

データを収集するため、私たちはまずデータ収集用のウェブアプリをつくることから始めました。入力する文字を指定してキーボード上にその文字を書くことで、入力されたキーのシーケンスが保存されるシンプルなアプリです。効率的なデータ収集のために、慣れた方には画面をタップすることで入力終了を判定する待ち時間をスキップする機能も搭載しました。その結果、プロ級の方になると 1 分間あたり約 60 個のデータを入力することが可能になり、高速なデータ収集が可能になりました。



人手によるデータ入力にはミスがつきものです。異常なデータをすばやく見つけて取り除けるよう、入力シーケンスの可視化インターフェイスも実装しました。他にも入力データ数による Contributor ランキングや各文字の累計データ数の表示など、データの入力をモチベートする細かな仕組みを搭載しています。



リリース前には社内で筆跡データ収集会を実施し、有志の Google 社員にデータ入力を手伝ってもらいました。その結果、約 4 万 6000 件の訓練データを収集することができました。収集されたデータは GitHubにて公開しています。データ構造の詳細については READMEをご覧ください。



データの前処理


訓練に使うデータは、以下のような入力されたキーのシーケンスによって表現されます。以下はひらがなの「い」が入力された一例で、各タプルは keydown イベントが発生したキーと発生した時間をミリ秒で表しています。ここでは複数のキーが同時に押された際の keydown イベントと keyup イベントの対応を特定する煩雑さを避けるため、ここでは keydown イベントのみを使っています。

[("e",0),("d",55),("c",102),("u",428),("j",507)]

私たちはこのシーケンスデータから高精度に文字を予測する機械学習モデルを模索しました。その過程でキーボード上でのキーの位置がキーだと気づき、シーケンスデータを画像情報に変換して畳み込みニューラルネットワーク(Convolutional Neural Network)を適用することにしました。以下では、シーケンスデータから画像情報を抽出する具体的な方法について説明します。

まず、シーケンスデータに含まれる各キー情報を JIS キーボードの QWERTY 配列を前提として x, y 座標情報に変換します。

QWERTY キー配列と x, y 座標系の対応


先ほどの「い」の例では、シーケンスが以下のように変換されます。

[((2.5,1),0),((3.0,2),55),((3.5,3),102),((6.5,1),428),((7.0,2),507)]

次に、x, y 座標に対して min-max 正規化を施し、各キーの x, y 座標を 0 から 1 の間に収めます。その結果、シーケンスデータは以下のように変換されます。

[((0.00,0.00),0),((0.11,0.50),55),((0.22,1.00),102),((0.89,0.00),428),((1.00,0.50),507)]

最後に、シーケンス内の各点を順々につなげるようにして、16px 四方の正方形のキャンバスの上に描写します。


「い」を描画した例


指がキーボードから離れた区間については、ユーザーの指の動きを特徴量に組み込むために半分の濃さの線で描画しています [1]。物理手書き入力では、指がキーボードから離れたことを keydown イベントから特定する必要があります。ここでは keydown イベントが発生した間隔に着目し、あるキー間の keydown イベントの間隔が他の間隔よりも有意に大きい場合には指が離れたものと判定しています。

MobileNet によるモデルの軽量化


ニューラルネットワークモデルによる認識精度を向上するためには、ニューラルネットワークを多層にして表現力を向上することが有効です。一方で、ニューラルネットワークを多層にすると学習すべきパラメーターの数が増えてしまい、モデルのファイルサイズも大きくなってしまいます。学習済みモデルを Raspberry Pi Zero のような組み込み向けモジュールで使うことや、ブラウザにダウンロードして使うことを考えると、モデルのファイルサイズが大きくなってしまうことは好ましくありません。

そこで私たちは Google が提唱する軽量なニューラルネットワークモデル、MobileNet に用いられている分離式畳み込み層 (separable convolutional layer) を応用することでモデルの軽量化を図りました。分離式畳み込み層は、畳み込み演算を空間方向の畳み込み (depth-wise convolution) とチャンネル方向の畳み込み (point-wise convolution) に分けることによって、学習するパラメーターの数を減らします [2]。分離式畳み込み層を使うことによって、通常の畳み込み層による実装では数 MB になってしまうモデルのファイルサイズを、同程度の精度を維持しながらも 150 キロバイト程度にまで減らすことができました。これにより、後述するハードウェアとブラウザでの高速なモデルの読み込みが可能になりました。

ドメイン知識の活用


上記の方法だけでも文字を認識する機械学習モデルを構築できたものの、精度の面で課題が残りました。たとえば、単純にストロークを画像情報に変換するだけでは、右から左に書かれた線と、左から右に書かれた線を区別できなくなります。また、キーボードから与えられる位置情報は低解像度のため、本来は異なる線が重なって描写されてしまうこともしばしばです。こういったデータの前処理で落ちてしまう情報が原因となって、満足する精度を達成することができませんでした。ここでは、これらの課題を解決するために導入した工夫を紹介します。

まず、私たちは文字を構成する線を 8 方向に分解する方向分解特徴 (directional feature) を導入しました。方向分解特徴は手書き文字認識における重要なドメイン知識のひとつであり、入力データをスパースにすることで小さな画像の中にも効率的に情報を保持できることが知られています [1]。私たちは、単一のチャンネルに画像情報を変換するのではなく、方向分解を施すことで 8 チャンネルの画像に変換するアプローチを採用しました。


「あ」と書かれたストロークの方向分解特徴


方向分解特徴を採用しても、低解像度のために重なってしまう線については課題が残りました。たとえば「は」と「ほ」は画数が異なるものの、「ほ」の 3 画目が 2 画目と重なってしまうことが多く観測されました。このような課題を解決するためには、書き始めから書き終わりまでのどのタイミングで線が書かれるのか、という情報が有効に働くと考えました。

そこで導入したのが時間的特徴(temporal feature)です。方向分解特徴を表す 8 チャンネルに加えて、だんだん線が薄くなる画像とだんだん線が濃くなる画像を加えることで、全体的な時間変化を表した特徴を導入しました。既存の 8 チャンネルに加えてこの 2 チャンネルを加えることで、さらなる精度向上を実現しました。

「あ」と書かれたストロークの時間的特徴


下図に、各特徴量を利用したときの正確度の比較を示します。方向分解特徴、時間的特徴ともに文字認識精度の向上に効果があることが確かめられました。方向分解特徴が筆の動きを表すことで局所的な時間情報を組み込み、時間的特徴が書き始めから書き終わりまでの変化を表すことで大域的な時間情報を組み込むことで、精度向上に貢献していると考えられます。

確認用データセットにおける各特徴量の有無による正確度の比較


以上の特徴量を導入した結果、最終的な機械学習モデルは 16px 四方の正方形のキャンバスに対して 8 つの方向分解特徴と 2 つの時間的特徴を描画した計 10 チャンネルからなる画像を入力として受け取るものになりました。MobileNet のネットワーク構成を元にして、できるだけ少ない層の数で高い精度を実現する構成を模索した結果、以下のネットワーク構成に至りました。
  • 畳み込み層(カーネル: 3x3、フィルタ数: 32、ストライド: 2、活性化関数: Relu) 
  • 分離式畳み込み層(カーネル: 3x3、フィルタ数: 64、ストライド: 1、活性化関数: Relu) 
  • 分離式畳み込み層(カーネル: 3x3、フィルタ数: 128、ストライド: 2、活性化関数: Relu) 
  • 分離式畳み込み層(カーネル: 3x3、フィルタ数: 128、ストライド: 1、活性化関数: Relu) 
  • 全結合層


今回の訓練用プログラムは nazoru-input パッケージとして PyPi で公開されています。以下のように nazoru-input パッケージをインストールし、訓練データを指定して nazoru-trainingコマンドを実行することで、お手元の環境でも機械学習モデルを構築できます。今回用いた訓練データは https://github.com/google/mozc-devices/raw/master/mozc-nazoru/data/strokes.zipからダウンロードできます。

$ pip install nazoru-input
$ nazoru-training ./data/strokes.zip

この nazoru-trainingは標準的な TensorFlow の API を利用して実装されていますので、簡単にカスタマイズして利用していただけます。ハイパーパラメーターや入力データセットをコマンドラインオプションで変更することも可能です。詳しくは nazoru-training --helpコマンドを参照してください。

ハードウェアでの推論


このようにして構築した機械学習モデルをユーザーが手軽に使えるようにするにはどうすればいいか、チーム内で活発な議論がなされました。パソコンやスマートフォンに特別なソフトウェアをインストールすることなくお気に入りのキーボードですぐに物理手書き入力を使えるようにするため、私たちは学習済みモデルを組み込んだハードウェア「物理手書きコンバーター」を製作することにしました。この物理手書きコンバーターは、訓練済みモデルを使って推論するプログラムを Raspberry Pi Zero にインストールしたものです。ここでは、物理手書きコンバーターを構築する手順を説明します。

推論用プログラムは訓練用プログラムと同様に nazoru-input パッケージに含まれています。nazoru-inputパッケージをインストールし nazoru-inputコマンドを実行することで、お手持ちのコンピュータをつかって簡単に物理手書き入力を試すことができます。

$ pip install nazoru-input
$ nazoru-input


推論の機能を手軽に拡張して遊んでいただけるように、API もシンプルにしてあります。以下のようなコードを書くだけで学習済みモデルを利用した推論ができます。詳しくは nazoru-input のコードを参考にしてください。

from nazoru import get_default_graph_path
from nazoru.core importNazoruPredictor

predictor =NazoruPredictor(get_default_graph_path())

# [(key, ms_from_first_input)]
sample_input =[('e',0),('d',100),('c',200),('v',300),
               ('u',800),('j',900)]
results = predictor.predict_top_n(sample_input,5)
for result in results:
 print('kana: %s, key: %s, probability: %.3f'% result)


物理手書きコンバーターは Raspberry Pi Zero に nazoru-inputパッケージをインストールし、USB で接続されたキーボードから受け取ったキー情報を推論プログラムによって文字に変換、Bluetooth で出力することによって実装されています。このうち、キー入力から文字に変換する部分は基板がなくてもお試しいただけるので、ご家庭にある Raspberry Pi に nazoru-input パッケージを入れるだけで手軽に手書き機能を利用したプログラムを実装することができます。

また、今回は物理手書きコンバーターのために製作した基板の設計図の CAD データを公開しました。この基板には Bluetooth 通信のためのモジュールやステータス表示のための LED が搭載されており、Raspberry Pi に接続することでパソコンやスマートフォンに Bluetooth を通じて文字を送信することが可能になります。利用する部品は Raspberry Pi Zero や RN42 といった通販や店頭で購入できるものに限定しました。Raspberry Pi Zero を利用することで大きさの制約も小さくしましたので、さまざまな形状のデバイスに組み込むことが可能です。CAD データを編集することで、自由に機能を変更、追加した基板も作製可能です。

さらに、公開されている基板には拡張性をもたせるために未接続のパッド、SPI・I2C 接続用のコネクタ、UART のための切断可能なパターンを用意してあります。これにより、モード切り替えスイッチを実装したり、SPI・I2C 接続のディスプレイによって軌跡を表示するなどの拡張が可能です。

物理手書きコンバーターのプリント基板図面


ブラウザでの推論


お手元に物理手書きコンバーターがない皆さまにもお手軽に物理手書き入力を楽しんでいただくため、私たちはブラウザ上で機械学習モデルが動作するデモを構築しました。TensorFlow で学習したモデルを TensorFlow.jsに移植することでブラウザ上での推論を実現しています。

訓練用プログラム nazoru-trainingは訓練済みモデルを SavedModel 形式で出力します。SavedModel 形式で保存された訓練済みモデルを TensorFlow.js で読み込むには、TensorFlow.js converterを使って Web-friendly format に変換する必要があります。TensorFlow.js converter は変換のためのスクリプトと、変換済みモデルを読み込む Javascript API を提供するライブラリです。以下のコマンドのように tensorflowjs パッケージをインストールして tensorflowjs_converterコマンドを実行することで、訓練済みモデルを変換します。その際、変換するモデルの形式(この場合は SavedModel なので tf_saved_model)、出力層に相当するノードの名前(nazoru-trainingのデフォルト設定では Nazorunet/Predictions/Reshape_1)を指定します。

$ pip install tensorflowjs
$ tensorflowjs_converter \
   --input_format=tf_saved_model \
   --output_node_names='Nazorunet/Predictions/Reshape_1'\
   /nazorunet/saved_model \
   /nazorunet/web_model


変換が成功すると、tensorflowjs_converter は以下の 3 種類のファイルを出力します。
  • web_model.pb (the dataflow graph) 
  • weights_manifest.json (weight manifest file) 
  • group1-shard\*of\* (collection of binary weight files) 


ネットワークを構成する各パラメーターの重みは group1-shard\*of\* に記述され、モデルの大きさに応じて各ファイルが 4MB に収まるようにシャーディングされます。この工夫により、ブラウザにネットワークファイルがキャッシュされます。

あとは tfjs-converter npmパッケージをインストールし、以下のようにモデルを読み込めばブラウザでの推論ができます。

import*as tfc from'@tensorflow/tfjs-core';
import{loadFrozenModel}from'@tensorflow/tfjs-converter';
const model = await loadFrozenModel(
     '/nazorunet/web_model.pb',
     '/nazorunet/weights_manifest.json');
// Gets a canvas or image element.
const inputImage = document.getElementById('input-image');
const result = model.execute({input: tfc.fromPixels(inputImage)});
// Returns predicted probabilities for each class in a float array.
const probs = result.dataSync();

console.log(probs) // Float32Array(88) [...]

アプリケーションによってはブラウザ上で高頻度で推論を繰り返すことも考えられるため、TensorFlow.js は効率的にメモリを管理するための便利なメソッドも用意しています。詳しくは Core Concepts in TensorFlow.jsをご参照ください。

まとめ


以上、Gboard 物理手書き入力バージョンを支える機械学習技術を紹介しました。

「機械学習モデルの構築」では、効率的に訓練データを収集する仕組みの重要性について述べました。これまでにないタスクに取り組む場合、そもそも学習のためのデータがない場面も珍しくありません。そのような場合、データ収集を効率的に行うための仕組みづくり、インターフェイスの構築が重要になります。

ニューラルネットワークを多層にして表現力を豊かにすることがさまざまなタスクを解く上で有力である一方、機械学習応用の場が Raspberry Pi をはじめとする小型計算機やブラウザなどに広がっていることを考えると、高い精度を保持しながらもできるだけ軽量でシンプルな機械学習モデルを構築することは無視できない課題です。MobileNet をはじめとする軽量のネットワークモデルを採用すること、データの前処理に適切なドメイン知識を活用してモデルのサイズを保持しながらも精度を向上することが、このような課題に応える上で有効であることを示しました。

「ハードウェアでの推論」では、今回構築した機械学習モデルによる推論の方法を説明しました。Raspberry Pi を使ったデバイスの拡張方法についても述べ、推論プログラムに合わせてデバイスの振る舞いをカスタマイズする方法を紹介しました。

「ブラウザでの推論」では、TensorFlow.js を使ってブラウザで推論する方法を説明しました。TensorFlow.js Converter を使うことで簡単に訓練済みモデルの移植ができること、具体的な Javascript API の使用方法について述べました。

今回の記事が、さまざまなプラットフォームをサポートする機械学習システム構築の参考となれば幸いです。そして、Gboard 物理手書きバージョンが今後の文字入力のデファクト・スタンダードになる日がくることを願います。

参考文献


[1] Zhang, Xu-Yao, Yoshua Bengio, and Cheng-Lin Liu. "Online and offline handwritten chinese character recognition: A comprehensive study and new benchmark." Pattern Recognition 61 (2017): 348-360.
[2] Howard, Andrew G., et al. "Mobilenets: Efficient convolutional neural networks for mobile vision applications." arXiv preprint arXiv:1704.04861 (2017).


Written by:
- Shuhei Iitsuka - UX Engineer(Machine learning)
- Makoto Shimazu - Software Engineer(Hardware, System design)

共通要素を使った途切れない画面遷移: RecyclerView から ViewPager へ

$
0
0
この記事は Google マテリアル ギャラリー チーム ソフトウェア エンジニア、Shalom Gibly による Android Developers Blog の記事 "Continuous Shared Element Transitions: RecyclerView to ViewPager" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。

マテリアル デザインを利用しているアプリでは、視覚的に途切れない画面遷移が行われます。ユーザーがアプリを操作すると、アプリ内のビューの状態が変わります。その際に、あるビューと次のビューで共通する要素を連動させ、動きや変化を出すことにより、実際にインターフェースに手を触れている感覚を提供できます。

本投稿では、Android の Fragment 間で途切れない画面遷移を行う際のガイドラインや実装について説明します。また、RecyclerView のイメージから ViewPager のイメージを開き、再び RecyclerView に戻る画面遷移を実装する方法を紹介します。その際に、「共通要素」を使ってどのビューがどのように移動するかを決めます。ページを切り替えてからグリッドに戻る際に、最初に開いたときには画面外にあったアイテムに戻るという厄介な画面遷移にも対応します。

目指した動作は、次のとおりです。

説明をスキップして直接コードを見たいという方は、こちらをご覧ください。

共通要素とは


共通要素遷移を使うと、2 つのフラグメントに存在するビューが両者の間でどのように移動するかを決めることができます。たとえば、Fragment Aと Fragment Bの両方の ImageViewに表示されているイメージは、Bが表示される際に Aから Bに移動します。

共通要素の動作や基本的な Fragment の遷移の実装方法を説明したサンプルは、今までにもたくさん公開されています。本投稿では、基本はほぼ省略して、ViewPager を開く際とそこから戻る際の画面遷移を作成する具体的な方法について、順を追って示します。なお、画面遷移についてさらに詳しく知りたいという方は、まず Android デベロッパー サイトで画面遷移について学習することをおすすめします。また、こちらの 2016 Google I/O のプレゼンテーションもご覧ください。

問題点

共通要素のマッピング


画面を開く際と戻る際の遷移は、シームレスに行いたいものです。これには、グリッドからページャーへの遷移と、ページャーから関連するイメージに戻る際の遷移があります。ユーザーがページを切り替えると、開いたときとは違うイメージに戻ります。

これを実現するためには、共通要素の 動的再マッピングを行って、Android の画面遷移システムがこの魔法のような処理を行うために必要な情報を提供しなければなりません。

遅延読み込み


共通要素遷移は強力ですが、次の画面で読み込む必要がある要素を遷移前に扱わなければならない場合、複雑になることがあります。遷移先のフラグメントのビューが配置される前でまだ準備が整っていない場合、期待通りの画面遷移にならないかもしれません。

今回のプロジェクトでは、次の 2 つの点で読み込み時間が共通要素遷移に影響します。
  1. ViewPagerが内部フラグメントを読み込むために、数ミリ秒が必要です。さらに、表示されるページャー フラグメントにイメージを読み込む時間も必要です(場合によっては、アセットをダウンロードする時間も必要になります)。
  2. RecyclerViewでも、イメージをビューに読み込むために同じように時間がかかります。

デモアプリの設計

基本的な構造


実際の画面遷移に取りかかる前に、少しばかりデモアプリの構造を見てみましょう。

MainActivity は、イメージの RecyclerViewを表示するために、GridFragmentを読み込みます。RecyclerViewアダプタは、イメージ アイテム(ImageDataクラスで定義している配列定数)を読み込むとともに、表示されている GridFragmentImagePagerFragmentで置き換える onClickイベントを管理しています。

ImagePagerFragmentアダプタは、ネストされている ImageFragmentsを読み込み、ページの移動に合わせて個々のイメージを表示します。

注:デモアプリの実装には、非同期的にイメージをビューに読み込む Glideを使っています。使っているイメージは、デモアプリにバンドルされていますが、オンライン イメージを指す URL 文字列を格納するように、ImageDataクラスを簡単に変更することもできます。

選択位置 / 表示位置の連携


選択されたイメージの位置をフラグメント間で受け渡しするには、その位置を格納する場所が必要です。その場所として、MainActivityを利用します。

アイテムがクリックされたり、ページが変更されると、関連するアイテムの位置を使って MainActivity を更新します。

保存された位置は、後ほどいくつかの場所で利用します。
  • ViewPagerに表示するページを決めるとき
  • グリッドに戻るとき、戻り先のアイテムが確実に見えるように自動スクロールするとき
  • そしてもちろん、画面遷移のコールバックをフックするとき(次のセクションで詳しく説明します)

画面遷移の設定


前述のように、共通要素の 動的再マッピングを行って、画面遷移システムがこの魔法のような処理を行うために必要な情報を提供しなければなりません。

XML でイメージビューの transitionName属性を設定する静的マッピングではうまくいきません。同じレイアウトを共有するビュー(例: RecyclerViewアダプタによってインフレートされるビューや、ImageFragmentによってインフレートされるビュー)の数は可変であり、それに対応する必要があるからです。

これを実現するために、画面遷移システムが提供するいくつかの機能を使います。
  1. setTransitionNameを呼び出してイメージビューの遷移名を設定します。これによって、一意な遷移名でビューを識別できるようになります。setTransitionNameは、グリッドの RecyclerViewアダプタでビューをバインドするタイミングと、ImageFragmentonCreateViewで呼び出されます。両方とも、ビューを識別する名前として、一意なイメージ リソースを使います。
  2. SharedElementCallbacksを設定して onMapSharedElementsをインターセプトし、そこで共通要素名とビューのマッピングを調整します。この処理は、GridFragmentの終了時と、ImagePagerFragmentの開始時に行います。

FragmentManager のトランザクションの設定


フラグメントを置き換える画面遷移を始めるにあたって、最初に行う必要があるのは、FragmentManagerのトランザクションの準備です。ここでは、システムに共通要素遷移があることを知らせる必要があります。
fragment.getFragmentManager()
.beginTransaction()
.setReorderingAllowed(true) // setAllowOptimization before 26.1.0
.addSharedElement(imageView, imageView.getTransitionName())
.replace(R.id.fragment_container,
new ImagePagerFragment(),
ImagePagerFragment.class.getSimpleName())
.addToBackStack(null)
.commit();

setReorderingAllowedtrueに設定します。これにより、フラグメントの状態変化の順番が変更され、共通要素遷移が改善されます。置き換わるフラグメントの onDestroy()が呼ばれる前に、追加するフラグメントの onCreate(Bundle)が呼ばれるので、画面遷移が始まる前に共通のビューを作成して配置できるようになります。

イメージの移動


イメージが新しい場所に移動する際のアニメーションを定義するために、XML ファイルで TransitionSetを設定し、それを ImagePagerFragmentで読み込みます。
<ImagePagerFragment.java>
Transition transition =
TransitionInflater.from(getContext())
.inflateTransition(R.transition.image_shared_element_transition);
setSharedElementEnterTransition(transition);
<image_shared_element_transition.xml>
<?xml version="1.0" encoding="utf-8"?>
<transitionSet
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="375"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:transitionOrdering="together">
<changeClipBounds/>
<changeTransform/>
<changeBounds/>
</transitionSet>

共通要素のマッピングの調整


まず、GridFragmentを離れる際に共通要素のマッピングを調整します。そのためには、SharedElementCallbackを指定して setExitSharedElementCallback()を呼び出し、遷移に含めたいビューに要素名をマッピングします。

このコールバックは、フラグメントのトランザクションが発生して Fragment終了するときと、Fragmentがバックスタックからポップされて(「戻る」のナビゲーション)再度開始されるときに呼び出されることに注意してください。この動作を利用すれば、共通のビューを再マッピングして画面遷移を調整することで、イメージのページを移動してビューが変更された場合にも対処できます。

今回の例では、関係があるのは、グリッドからビューページャーが保持しているフラグメントに移動する 1 つの ImageViewだけです。そのため、マッピングの調整は、onMapSharedElementsコールバックで受け取った最初の名前付き要素に対してのみ行います。
<GridFragment.java>
setExitSharedElementCallback(
new SharedElementCallback() {
@Override
public void onMapSharedElements(
List<String> names, Map<String, View> sharedElements) {
// Locate the ViewHolder for the clicked position.
RecyclerView.ViewHolder selectedViewHolder = recyclerView
.findViewHolderForAdapterPosition(MainActivity.currentPosition);
if (selectedViewHolder == null || selectedViewHolder.itemView == null) {
return;
}

// Map the first shared element name to the child ImageView.
sharedElements
.put(names.get(0),
selectedViewHolder.itemView.findViewById(R.id.card_image));
}
});

共通要素のマッピングの調整は、ImagePagerFragmentが開始される際にも行う必要があります。今度は、setEnterSharedElementCallback()を呼び出します。
<ImagePagerFragment.java>
setEnterSharedElementCallback(
new SharedElementCallback() {
@Override
public void onMapSharedElements(
List<String> names, Map<String, View> sharedElements) {
// Locate the image view at the primary fragment (the ImageFragment
// that is currently visible). To locate the fragment, call
// instantiateItem with the selection position.
// At this stage, the method will simply return the fragment at the
// position and will not create a new one.
Fragment currentFragment = (Fragment) viewPager.getAdapter()
.instantiateItem(viewPager, MainActivity.currentPosition);
View view = currentFragment.getView();
if (view == null) {
return;
}

// Map the first shared element name to the child ImageView.
sharedElements.put(names.get(0), view.findViewById(R.id.image));
}
});

遷移の先送り


移動させるイメージは、グリッドとページャーに読み込まれますが、読み込みには時間がかかります。これをきちんと動作させるために、関係するビューが準備(例: イメージデータのレイアウトや読み込み)できるまで遷移を先送りする必要があります。

そのためには、フラグメントの onCreateView()postponeEnterTransition()を呼び出し、イメージの読み込みが完了したタイミングで startPostponedEnterTransition()を呼び出して画面遷移を開始します。

注: アプリで開く操作と戻る操作の両方に対応するため、先送りはグリッドとページャーの両方のフラグメントで呼び出します。



イメージの読み込みには Glideを使っているので、イメージが読み込まれた際に遷移の開始をトリガーするリスナーを設定します。

これは、次の 2 か所で行います。
  1. ImageFragmentのイメージが読み込まれたときに、親の ImagePagerFragmentを呼び出して遷移を開始します。
  2. グリッドに戻る遷移の際は、「選択されている」イメージが読み込まれた後に、遷移の開始が呼び出されます。

以下に、イメージが読み込まれて準備ができたときに親に通知する ImageFragmentを示します。

postponeEnterTransitionImagePagerFragmentで実行されますが、startPostponeEnterTransitionはページャーが作成した子 ImageFragmentから呼ばれる点に注意してください。
<ImageFragment.java>
Glide.with(this)
.load(arguments.getInt(KEY_IMAGE_RES)) // Load the image resource
.listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model,
Target<Drawable> target, boolean isFirstResource) {
getParentFragment().startPostponedEnterTransition();
return false;
}

@Override
public boolean onResourceReady(Drawable resource, Object model,
Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
getParentFragment().startPostponedEnterTransition();
return false;
}
})
.into((ImageView) view.findViewById(R.id.image));

気づいた方もいらっしゃるかもしれませんが、読み込みが失敗した際にも遷移を先送りする呼び出しを行っています。これは、失敗したときに UI がハングしないようにするために重要です。

最後の仕上げ


さらに画面遷移をスムーズにするために、イメージがページャー ビューに移動する際に、グリッド アイテムをフェードアウトさせましょう。

これを行うには、GridFragmentが終了する際の遷移に適用される TransitionSetを作成します。
<GridFragment.java>
setExitTransition(TransitionInflater.from(getContext())
.inflateTransition(R.transition.grid_exit_transition));
<grid_exit_transition.xml>
<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="375"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:startDelay="25">
<fade>
<targets android:targetId="@id/card_view"/>
</fade>
</transitionSet>

終了時の遷移を設定すると、画面遷移は次のようになります。

気づいた方もいらっしゃるかもしれませんが、まだこの画面遷移は完璧とは言えません。フェードするアニメーションは、ページャーに移動するイメージが表示されているカードを含め、すべてのグリッドのカードビューに対して実行されています。

この点を修正するには、GridAdapterでフラグメントのトランザクションをコミットする前に、クリックしたカードを終了時の遷移から除外します。
// The 'view' is the card view that was clicked to initiate the transition.
((TransitionSet) fragment.getExitTransition()).excludeTarget(view, true);

この変更を行うと、アニメーションはかなり優れたものになります(終了時の遷移で、クリックしたカードはフェードアウトしませんが、その他のカードはすべてフェードアウトします)。

最後の仕上げとして、GridFragmentをスクロールするよう設定し、ページャーから戻る際に遷移先のカードが表示されるようにします(これは、onViewCreatedで行います)。
<GridFragment.java>
recyclerView.addOnLayoutChangeListener(
new OnLayoutChangeListener() {
@Override
public void onLayoutChange(View view,
int left,
int top,
int right,
int bottom,
int oldLeft,
int oldTop,
int oldRight,
int oldBottom) {
recyclerView.removeOnLayoutChangeListener(this);
final RecyclerView.LayoutManager layoutManager =
recyclerView.getLayoutManager();
View viewAtPosition =
layoutManager.findViewByPosition(MainActivity.currentPosition);
// Scroll to position if the view for the current position is null (not
// currently part of layout manager children), or it's not completely
// visible.
if (viewAtPosition == null
|| layoutManager.isViewPartiallyVisible(viewAtPosition, false, true)){
recyclerView.post(()
-> layoutManager.scrollToPosition(MainActivity.currentPosition));
}
}
});

まとめ

本記事では、RecyclerViewから ViewPagerを開く際と、そこから戻る際のスムーズな画面遷移を実装しました。

画面遷移を先送りし、ビューの準備ができてから遷移を開始する方法を紹介するとともに、共通要素の 再マッピングも実装し、アプリの操作によって共通のビューが動的に変わる場合の画面遷移にも対応しました。

このような変更を行うことによって、ユーザーがアプリを操作する際に、視覚的に途切れることがない優れたフラグメントの遷移を実現できます。


 


デモアプリのコードは、こちらに掲載されています。

Reviewed by Yuichi Araki - Developer Relations Team

Chrome 66 ベータ版: CSS Typed Object Model、非同期クリップボード API、AudioWorklet

$
0
0
この記事は Naina Raisinghani による Chromium Blog の記事 "Chrome 66 Beta: CSS Typed Object Model, Async Clipboard API, AudioWorklet" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。

特に記載のない限り、下記の変更は Android、Chrome OS、Linux、macOS、Windows 向けの最新の Chrome ベータ版に適用されます。Chrome 66 の完全な機能リストについては、ChromeStatusを参照してください。

<canvas> の ImageBitmap レンダリング コンテキスト

これまでキャンバスにイメージをレンダリングするには、最初に <img>タグを作成してからコンテンツをキャンバスにレンダリングしていました。そのため、イメージのコピーがメモリに複数保存されていました。新しいレンダリング コンテキストでは、メモリでの重複を避けて効率のよいレンダリングを行うことによって、ImageBitmapオブジェクトの表示を効率化しています。
次の例は、ImageBitmapRenderingContextを使ってこれを行う方法を示しています。ここでは基本的に、イメージのピクセルの所有権を移転しています。この例では、blob から <canvas>への移動によってそれを実現していますが、ピクセルは <canvas>要素間でも移動させることができます。なお、blob は圧縮されているため、メモリに完全なコピーは保持されません。

const image = await createImageBitmap(imageBlob);
const canvas = document.createElement('canvas');
const context = canvas.getContext('bitmaprenderer');
context.transferFromImageBitmap(image);

canvas.toBlob((outputJPEGBlob) => {
// Do something with outputJPEGBlob.
}, 'image/jpeg');

createImageBitmap()を使わずにこれを行うと、imageBlobが遅延デコードされてジャンクが発生することがあります。一方、createImageBitmap()は非同期なので、使用する前に完全にデコードでき、ジャンクが発生することはありません。たとえば、WebGL ゲームでこれを使うと、ゲームプレイの進行に合わせてその場で新しいテクスチャを読み込むことができます。

CSS Typed Object Model

これまで、CSS プロパティを操作したいデベロッパーは、後でブラウザが変換を行って型付きの表現に戻されるにもかかわらず、文字列を操作しなければなりませんでした。さらに悪いのは、デベロッパーが Javascript で CSS プロパティ値を読み出す場合です。そのとき、型付きの値は再度変換されて文字列に戻されます。
Chrome バージョン 66 では、Houdiniの一環として、一部の CSS プロパティCSS Typed Object Model(OM)Level 1実装されています。Typed OM では、CSS の値が文字列ではなく、型付きの JavaScript オブジェクトとして公開されるので、デベロッパーとブラウザの負荷を減らすことができます。CSS プロパティに割り当てられた値を効率的に操作できることに加え、保守性が高くわかりやすいコードを記述することもできます。
次に、簡単な例を示します。以前は、次のように要素の不透明度を指定していました。

el.style.opacity = 0.3;
el.style.opacity === "0.3"

CSSOM を利用すると、次のようになります。

el.attributeStyleMap.set("opacity", CSS.number("0.3"));
el.attributeStyleMap.get("opacity").value === 0.3

上の戻り値は、CSSUnitValue型なので、文字列よりも扱いやすくなっています。

非同期クリップボード API

新しい非同期クリップボード APIを使うと、Promise ベースの方法でクリップボードの読み込みと書き込みができます。これは Chrome 43 でリリースされた古い execCommand('copy') API よりもシンプルで、Permissions APIとも統合されています。今後の Chrome のリリースでは、イメージなどの高度なデータのコピーや貼り付けもサポートされる予定です。
この API の感触を味わっていただくために、テキストの書き込みと読み込みの操作を行ってみましょう。

try {
await navigator.clipboard.writeText("Hello, clipboard.");
} catch {
console.error("Unable to write to clipboard.");
}

テキストの読み出しも同じように行うことができます。

const data = await navigator.clipboard.readText();
console.log("From the clipboard:", data);

API のセキュリティやパーミッションの利用方法など、詳しくは非ブロッキング クリップボード アクセスをお読みください。また、サンプルもご覧ください。

AudioWorklet

以前の ScriptProcessorNodeは非同期で、スレッドのホップが必要でした。そのため、オーディオ出力が不安定になることもありました。AudioWorklet オブジェクトは、新しい同期型の JavaScript 実行コンテキストを提供します。これにより、デベロッパーがプログラムからオーディオを制御できるようになり、レイテンシを増加させることなく非常に安定したオーディオ出力を得ることができます。
実際のサンプルコードなどの例は、Google Chrome Labsでご確認ください。
AudioWorklet と合わせて、他のワークレット API の開発も行われています。Chrome 65 / Opera 52 では、PaintWorklet がリリースされました。AnimationWorkletも計画されています。AudioWorkletの導入後には、ScriptProcessorNodeが非推奨となる予定です。

今回のリリースに追加されたその他の機能

Blink > Animation

add および accumulate 合成操作は、モジュール化されたアニメーションを作成するためのものです。Chrome では、近いうちに addキーワードおよび accumulateキーワードがサポートされる予定です。それまで、上記のキーワードはエラーをスローしなくなります。これは、Firefox などの実装と互換性を維持するための措置です。

Blink > CSS

CSS に 2 つの新機能が追加されました。
  • メディアクエリで算術式 calc()min()max()がサポートされます。これは、CSS Values and Units Module Level 4仕様で要求されています。この変更により、数値が許可される場所であれば、どこでもこれらの関数を使用できるようになり、他のルールとも一致することになります。
  • rgb()関数と rgba()関数で浮動小数点値が許可されるようになりました。

Blink > Feature Policy

デフォルトで、deviceorientationdeviceorientationabsolutedevicemotionの各イベントは、トップレベルのドキュメントと同じオリジンのサブフレームに制限されます。これは、それぞれのフィーチャー ポリシー'self'に設定された場合と同様です。この動作を変更するには、明示的に特定のフィーチャーを有効化または無効化します。

Blink > File API

File APIで無効な、または存在しない blob URL から読み取ろうとした場合、404 ではなくネットワーク エラーが発生するようになりました。

Blink > Forms

HTML フォームに 2 つの新機能が追加されました。
  • 仕様で要求されているとおり、<textarea>要素と <select>要素で autocomplete属性がサポートされました。
  • 変更可能なチェックボックスが HTML 仕様で要求されている 3 つのイベントを発行するようになります。これは、clickイベント、inputイベント、changeの順に発行されます。以前は、clickイベントと changeイベントのみが発行されました。

Blink > Fullscreen

全画面モードのページでポップアップが開いて window.focus()が呼び出された場合、ページの全画面が終了します。これは、別の方法でポップアップにフォーカスが移った場合には発生しません。

Blink > GetUserMedia

新しいメソッド getCapabilities()MediaStreamTrackインターフェースに追加されます。
これは、各制約可能プロパティの値または値の範囲を指定する MediaTrackCapabilitiesオブジェクトを返します。これによって返される能力は、端末によって異なります。

Blink > JavaScript

JavaScript には、何点かの変更が行われています。
  • Function.prototype.toString() 関数は、ソースコードの内容を厳密に返すようになりました。これには空白など、使用されている可能性がある他のテキストも含まれます。たとえば、function キーワードと関数名の間にコメントがあった場合、キーワードと名前に加えてコメントも返されるようになります。
  • JSON は ECMAScript の構文的なサブセットになります。これにより、文字列リテラルに行セパレータ(U+2028)とパラグラフ セパレータ(U+2029)のシンボルを利用できるようになります。
  • try文の catch句がパラメータなしで利用できるようになりました。
  • 文字列から空白を取り除く標準ベースの方法として、すでに実装されている String.prototype.trim()に加えて、String.prototype.trimStart()String.prototype.trimLeft()が利用できるようになりました。下位互換性のため、標準に含まれていない trimLeft()trimRight()も、新しいメソッドの別名として残されます。
  • Array.prototype.values() メソッドは、配列の各インデックスに対応する値を含む新しい配列イテレータ オブジェクトを返します。
Blink > Layout
レイアウトに 2 つの新機能が追加されました。
  • 以下の CSS の余白関連のプロパティから、プレフィックス「grid」が削除されました。
    • grid-gapgapに変更
    • grid-row-gaprow-gapに変更
    • grid-column-gapcolumn-gapに変更
この 3 つのプロパティのデフォルト値は、すべて normalです。プレフィックス付きのプロパティは、この新しいプロパティの別名となります。column-gapプロパティはすでに存在し、css-multicolで利用されている点に注意してください。
  • transform プロパティを持つ display プロパティの要素である table-rowtable-row-group table-header-grouptable-footer-grouptable-celltable-captionが、固定位置要素のブロックを包含するようになりました。現在 Blink では、<tr><tbody><tfoot><thead>については固定位置要素のブロックは包含されません。

Blink > Media

メディアに 2 つの新機能が追加されました。
  • 以前にお知らせしたように、autoplay許可されるのは、ユーザーがクリックまたはタップしたサイトのメディアが音声を再生しない場合か、以前に(PC で)ユーザーがサイトのメディアに興味を示した場合のみになります。これにより、初めてウェブページを開いた際に、予期せず音声付きの動画が再生されることが少なくなります。
  • Media Capabilities の Decoding Info APIを使うと、ウェブサイトがクライアントのデコード機能についてより多くの情報を得られるようになります。その結果、より多くの情報に基づいてユーザー用のメディア ストリームを選択できるようになるため、利用できる帯域幅と画面サイズのみによって解像度が選ばれ、クライアントでスムーズかつ電源効率のよいデコード処理ができなくなる事態を防ぐことができます。

Blink > Network

Fetch API に 2 つの新機能が追加されました。
  • Request オブジェクトが keepalive プロパティをサポートするようになりました。これにより、タブが閉じられた後もフェッチを継続できるようになります。この機能は、コンストラクタの初期化オブジェクトにブール値を渡すことによって起動できます。プロパティの値は、オブジェクト自身から読み出すことができます。このプロパティは、sendBeacon()と合わせて使用することもできます。
  • 新しい AbortSignalおよび AbortControllerインターフェースを使ってフェッチをキャンセルできるようになりました。これを行うには、AbortControllerオブジェクトを作成し、その signal プロパティを fetchのオプションとして渡します。abortController.abort()を呼び出すと、フェッチをキャンセルできます。詳しくは、中断可能なフェッチについての記事をご覧ください。簡単なサンプルコードを以下に示します。


const controller = new AbortController();
const signal = controller.signal;
const requestPromise = fetch(url, { signal });

// Abort the fetch:
controller.abort();

Blink > ServiceWorker

Service Worker には、2 つの変更が行われました。
  • Service Worker は、リクエストのモードが same-originでレスポンスのタイプが CORSである場合、応答しなくなります。これは、Fetch 仕様に最近追加されたセキュリティ対策です。
  • FetchEvent.clientIdに何も設定されていない場合、null ではなく空の文字列を返すようになりました。これは、ナビゲーション リクエストの最中などに発生することがあります。

Blink > WebRTC

Chrome が RTCRtpSender.dtmfをサポートするようになりました。
これは仕様に従った属性で、まだ非推奨となっていない CreateDTMFSender()関数に代わるものです。

サポートの終了と相互運用性の改善

Blink > CSS

object-positionおよび perspective-originプロパティで、top right 20%のように 3 つ部分からなる値が許可されなくなりました。この変更は、基本的な図形やグラデーションにも適用されます。有効な位置の値は、1 つ、2 つ、または 4 つの部分からなる値である必要があります。

    Blink > HTML

    仕様の変更に従い、ImageCapture.prototype.setOptions()は削除されました。

      Blink > Input

      仕様の変更に従い、document.createTouch()および document.createTouchList()は削除されました。

      Blink > Web Audio

      仕様の変更に従い、AudioParam.prototype.valueの変更の自動 dezippering が Chrome から削除されました。AudioParam の値の変化をスムージングする必要がある場合は、 AudioParam.prorotype.setTargetAtTime()を利用してください。

        Reviewed by Eiji Kitamura - Developer Relations Team

        Android Things Developer Preview 7

        $
        0
        0
        この記事は IoT デベロッパー アドボケート、Dave Smith による Android Developers Blog の記事 "Android Things Developer Preview 7" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。

        本日(*原文公開当時)、Android Things の Developer Preview 7(DP7)をリリースいたします。Android Things は、Android デベロッパーがモノのインターネット(IoT)端末を構築できるようにする Google 製プラットフォームです。このプラットフォームは、動画やオーディオの処理、TensorFlow による端末上機械学習など、強力なアプリケーションもサポートしています。

        最新のプレビューは Android 8.1 がベースとなっており、Google Play Services バージョン 11.8.0をサポートするようにアップデートされています。DP7 の詳しい内容については、リリースノートをご覧ください。ここでは、いくつかの重要な機能について紹介します。

        コンソールの強化と端末のアップデート


        Android Things Consoleにも新機能が追加され、プロトタイプから本番までのプロダクト管理が強化されています。
        • プロダクト モデル:同じハードウェアのプロダクトに対して複数のソフトウェア バリエーションを作成し、それぞれのビルドやアップデートを独立して管理します。
        • プロダクト共有:追加のユーザー アカウントに対し、指定されたプロダクトのモデル、ビルド、アップデートを参照および管理する権限を付与します。
        • アナリティクス:プロダクトについて、端末のアクティベーションに関する指標やアップデートの統計を参照します。
        • アップデート チャンネル:開発用やベータ版テスト用に、端末のグループにソフトウェア ビルドをデプロイします。現在使用されている本番端末に支障が出ることはありません。

        UpdateManagerに追加された新しい API を使うと、端末ごとに異なるアップデート チャンネルに登録できます。アップデート チャンネルへの登録については、改訂された Device Updates API ガイドコンソール ドキュメントをご覧ください。

        デベロッパーからのフィードバックへの対応


        デベロッパーの皆さんから、たくさんのすばらしいフィードバックをいただいています。今回のリリースでは、数多く寄せられた問題に対応することに特に重点を置いています。
        • カメラがサポートする解像度の向上:アプリから、カメラ ハードウェアのネイティブのフル解像度で撮影できるようになります。
        • MIDI サポート:アプリで MidiManager API を使って仮想 MIDI 端末を構築したり、外部 MIDI コントローラとインターフェースすることが可能になります。
        • Android Things アプリのテスト性の向上:Peripheral I/O API で公開されるのが抽象クラスではなくインターフェースになったので、ローカルでの単体テストの際にオブジェクトをモックやスタブと入れ替える操作が簡単になります。
        • 一貫性のある API 名:今回のリリースでは、全般的に一貫性のあるデベロッパー エクスペリエンスを提供するため、多くの既存の Android Things API クラスの名前が変更されています。改訂された API リファレンスを参照し、パッケージ名やクラス名がどのように変更されているかをご確認ください。

        新しい Bluetooth API


        Android モバイル端末のユーザーは、Settings アプリから Bluetooth 端末とのペア設定や接続を行うことができます。Android Things を実行している IoT 端末では、同じ操作をプログラムから行う必要があります。新しい BluetoothConnectionManager API を使うと、ペア設定や接続のプロセスをアプリから制御できます。詳しくは、新しい Bluetooth API ガイドをご覧ください。

        サンプルのアップデート


        昨年の Google I/O では、Android Things での Kotlin を使ったアプリ構築について紹介しました。Kotlin を使っているデベロッパーの皆さんのために、Kotlin 版の Android Things サンプルの公開を始めました。本日より、ボタンと LED のサンプルは Kotlin と Java の両方をダウンロードできます。近日中に、別のサンプルにも対応する予定です。

        また、TensorFlow イメージ分類サンプルアプリを移行して、TensorFlow Liteライブラリを使うようにしました。これにより、事前トレーニング済みの TensorFlow モデルのサイズが 90% 以上小さくなり、イメージの分類に必要な時間も約 50% 短縮されています。

        フィードバック


        バグレポート機能リクエストを送信し、フィードバックをお願いします。質問は、どんなものでもかまいませんので、Stack Overflowにお寄せください。Google+ の Google IoT デベロッパー コミュニティにも参加できます。これは、最新情報を入手したりアイデアを話し合うことができるすばらしいリソースです。皆さんが Android Things で作るアプリを楽しみにしています!


        Reviewed by Takeshi Hagikura - Developer Relations Team

        Firebase Realtime Database が Google Stackdriver Alerts をサポート

        $
        0
        0
        この記事は Tyler Rockwood、ソフトウェア エンジニアによる The Firebase Blog の記事 "Alert Alert! The Firebase Realtime Database now supports Google Stackdriver Alerts!" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。


        ダッシュボードはすばらしい機能です。でも、もしそれを確認していなければどうなるでしょう。トラフィックが急上昇したときや、1 つのデータベースに対する同時接続数の制限に達しそうなときに通知を受けられたら、すばらしいと思いませんか?大丈夫です。Google Stackdriver Alertsが対応してくれます。

        昨年 12 月、Firebase Realtime Database と Google Stackdriverが統合され、強力な新しい指標を使ってダッシュボードやグラフを作成できるようになったことをお知らせしました。また、利用できる指標や、データベースのモニタリングやデバッグに役立つ手法について、ドキュメントに詳しい説明を掲載しました。このたび、Google Stackdriver Alerts で、これらすべてのデータに基づいたアクションを行えるようになりました。

        特定の条件が満たされたときに特定のアクションを取るようにアラートを設定できます。たとえば、1 分以上にわたって io/database_load指標が 90% を超えた場合、エンジニアリング チームにメールを送ることができます。アラートにメモを含めることもできるので、まだ朝のコーヒーを飲み終えていない場合でも安心です。アラートを起動できる詳しい条件については、条件の詳細について記載されたドキュメントをご覧ください。

        Google Stackdriver では、非常に多彩な条件を利用できるだけでなく、アラートの 手段も選ぶことができます。無料プランでは、メールによる通知か、Google Cloud Console モバイルアプリによる通知を受けることができます。プレミアムプランでは、PagerDutyのインシデント作成や、Slack Channelへのメッセージ投稿も可能です。私が個人的に気に入っているプレミアム通知は、Webhookオプションです。これを使うと、Cloud Function をトリガーして問題の診断に役立てることもできます。先ほどの負荷の例でいえば、データベースの負荷が 100% に近づいた場合に Cloud Function を起動してデータベースのプロファイリングを行い、その結果を Slack Channel に送ることができます。

        Stackdriver でカスタム アラートを設定するのは簡単です。まず、Stackdriver Monitoring Consoleを開きます。アカウントの登録を終えて [Alerting] > [Create a Policy]に移動すると、次のようなパネルが表示されます。

        このアラート ポリシーでは、1 分以上にわたってデータベースの使用率が 90% を超えた場合に、alerts@you.com にポリシーの名前と指定されたメモを含むメールを送るように設定しています。あとは、[Save Policy] ボタンを押すだけでアラートが有効化されます。



        Reviewed by Khanh LeViet - Developer Relations Team

        20 タイトルが選出!優勝者は 4/28 のファイナルイベントにて決定[Indie Games Festival 2018]

        $
        0
        0
        Google Play が主催する日本のインディーゲーム開発者のためのコンテスト、Indie Games Festival 2018 にたくさんのゲームをご応募いただきありがとうございました!

        インディゲーム開発者の皆様の情熱が詰まった数多くのタイトルの中から、厳正なる審査により以下のトップ 20 が選出されました!

        (アルファベット順、五十音順、アイコンにリンクがないものはベータ版です)


        BQM ブロッククエスト・メーカー
        Craft Warriors
        Enblox
        From_.
        in:dark - インダーク
        Million Onion Hotel
        Ninja Flicker
        PARADE! (ベータ版)
        Peko Peko Sushi
        StrangeTelephone
        思い出の食堂物語 ~心にしみる昭和シリーズ~
        怪異掲示板と 7 つのウワサ
        キメラリコレクト(ベータ版)
        クリスタル・クラッシュ【超攻撃的パズル合戦!】
        旅かえる
        ねぇ AI、本当の事がしりたい
        ねこかわいいぼくゆうれい
        ネコの絵描きさん
        ぼくとネコ
        リバーシクエスト 2(ベータ版)


        4 月 28 日(土)にイベントスペース「タブロイド」にてファイナルイベントを開催し、トップ 20 に選出されたゲームを展示いたします。一般参加の皆様にはイベント当日に会場で、または Google Play ストアからゲームをダウンロードして遊んでいただき、会場にて応援したいゲームへ投票していただきます。

        一般参加者の投票によってトップ 10 を決定し、その後にプレゼンテーションと審査員による採点によってトップ 3 の受賞者を決定します。また、少年ジャンプ+賞はトップ 20 より選出されます。

        当日、会場でのゲームの投票に参加されたい方はこちらの参加フォームからご応募ください。事前登録の受付締切は 4 月 15 日(日)23:00 です。

        ゲームファンの皆様からのご応募お待ちしております!

        イベントについての詳細は Indie Games Festival 公式ホームページをご覧ください。


        Posted by Tomoko Tanaka - Google Play Team

        Flutter ベータ 1 のお知らせ: 美しいネイティブ アプリを構築する

        $
        0
        0
        この記事は Seth Ladd、Product Manager for Flutter による Google Developers Blog の記事 "Announcing Flutter beta 1: Build beautiful native apps" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。

        元の記事は、Seth Ladd が Flutter の Mediumに投稿したものです

        本日(*原文公開当時)はうれしいことに、Mobile World Congress 2018 で、Flutterの最初のベータ版リリースについてお知らせしました。Flutter は、Google の新しいモバイル UI フレームワークです。これを使うと、開発者は iOS と Android の両方で高品質なネイティブ インターフェースを作り上げることができます。早速、flutter.ioから美しいネイティブ アプリを作ってみましょう



        Flutter は、モバイル開発を最も効率よく行えるように、高いパフォーマンスとプラットフォームとの統一感、そしてポータブル UI ツールキットによる高速開発とマルチプラットフォームへの対応といった特徴を持っています。



        Flutter は、これからモバイルアプリの開発を行う開発者と、既にモバイルアプリ開発の経験がある開発者の両方を対象に設計されました。次のようなメリットを備えているので、高速に美しく質の高いアプリを構築できます。
        • ステートフル ホット リロード、新しいリアクティブ フレームワーク、高機能なウィジェット セット、統合ツールなどの機能を活用した高速開発
        • 組み合わせ可能なウィジェット セット、高機能アニメーション ライブラリ、レイヤー対応の拡張可能アーキテクチャによる表現力の高い柔軟なデザイン
        • GPU アクセラレーションに対応したポータブル レンダラーと高パフォーマンスなネイティブ ARM コード ランタイム、そしてプラットフォームの相互運用性による端末やプラットフォームを問わない高品質エクスペリエンス

        昨年のアルファ リリース以降、コミュニティの力も借りて、スクリーン リーダーやその他のユーザー補助機能のサポート、右から左へのテキスト、ローカライズと国際化、iPhone X と iOS 11 のサポート、インライン動画、サポート対象となる画像形式の追加、バックグラウンドでの Flutter コードの実行など、多くの機能を提供してきました。

        また、Android Studio Visual Studio Codeのサポート、新たなリファクタリングによるウィジェットのコード管理、モバイル プラットフォームの力を Flutter コードから利用できるようにするためのプラットフォームの相互運用性、ステートフル ホット リロードの改善、ウィジェット ツリーを表示する際に便利な新しいウィジェット インスペクターなど、ツールも大幅に改善されています。



        さまざまなフレームワークやツールの新機能のおかげで、Google(AdWords など)や世界中のチームが Flutter で成功を収めています。Flutter はすでに本番環境のアプリで使われており、数百万単位でインストールされています。Flutter で構築したアプリは App Store や Play Store(Hamilton: The Musicalなど)でも取り上げられ、スタートアップや開発会社も Flutter で成功を収めています。

        たとえば、フィンランドの開発会社 Codemateは、Flutter の高速な開発サイクルとカスタマイズ可能な UI ツールキットを活用し、Hookleの美しいアプリを短時間で開発しました。Codemate の CEO、Toni Piirainen 氏は、「お客様の業績に貢献し、モバイル ユーザーに高い価値を提供できるように、自信をもって Flutter をおすすめしています」と話しています。



        Flutter で開発したアプリは、さまざまなプラットフォームで品質、パフォーマンス、そしてカスタマイズできるデザインを実現します。

        Flutter のベータ版では、Dart 2プレリリース版も動作します。コードからの UI の宣言が最低限の記述量で行えるよう改善されています。たとえば、Dart 2 は newconstを推論できるので、UI 構築時のボイラープレートを削減できます。次に例を示します。

        // Before Dart 2
        Widget build(BuildContext context) {
        return new Container(
        height: 56.0,
        padding: const EdgeInsets.symmetric(horizontal: 8.0),
        decoration: new BoxDecoration(color: Colors.blue[500]),
        child: new Row(
        ...
        ),
        );
        }

        // After Dart 2
        Widget build(BuildContext context) =>
        Container(
        height: 56.0,
        padding: EdgeInsets.symmetric(horizontal: 8.0),
        decoration: BoxDecoration(color: Colors.blue[500]),
        child: Row(
        ...
        ),
        );


        Flutter のエコシステムの繁栄を目の当たりにして、私たちも興奮しています。Flutter で動作するパッケージは 1000 以上SQLiteFirebaseFacebook Connect共有プリファレンスGraphQL他多数)にのぼり、チャットには 1700 名以上が参加しています。コミュニティによって、Flutter InstituteStart FlutterFlutter Rocksなどの新しいサイトが生まれていることもうれしく思います。さらに、コミュニティが編集、発行する新しい Flutter Weekly ニュースレターを購読することもできます。

        現在は、1.0 リリースを見据えて、安定化とシナリオの補完に重点的に取り組んでいます。Flutter のロードマップは、コミュニティに大いに触発されています。現在は、Flutter の既存アプリへの埋め込みの簡易化、インライン WebViewルーティングおよびナビゲーション API の改善Firebase サポートの追加インライン マップコアエンジンの小型化といった機能に取り組んでいます。約 4 週間ごとに新しいベータ版をリリースする予定です。また、ぜひとも Issue Trackerで皆さんや皆さんのアプリにとって重要な問題に投票(👍)してください。

        今こそ、Flutter を試してみる最善のタイミングです。スタートガイドを参照すると、まったく初めての方でも短時間で初めての Flutter アプリを実行できます。すでに Flutter をインストールしている方は、こちらの手順に従ってベータ版チャンネルに切り替えることができます。

        皆さんのサポート、フィードバック、そして多くの貢献に心から感謝申し上げます。この旅を皆さんとともに続けられること、そして皆さんのアプリがリリースされることを楽しみにしています!



        Reviewed by Takuo Suzuki - Developer Relations Team

        Google API における JSON-RPC および Global HTTP Batch エンドポイントのサポート終了について

        $
        0
        0
        この記事は Google Cloud Platform チーム プロダクト マネージャー、Dan O’Meara による Google Developers Blog の記事 "Discontinuing support for JSON-RPC and Global HTTP Batch Endpoints" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
        
        私たちは、パフォーマンスやセキュリティを改善し、デベロッパーが API を構築する際に必要な機能を追加するため、API やサービス インフラストラクチャに多くのリソースを投入してきました。変更にあたっては、最新のアーキテクチャやビジネス要件に対応できなくなった機能に対処しなければなりません。

        そのような機能の例として、JSON-RPC プロトコル(http://www.jsonrpc.org/specification)と Global HTTP Batch(Javascript のサンプル)の 2 つがあげられます。これらの機能は、単一の共有プロキシがすべての API リクエストを受信するというアーキテクチャをベースにサポートしてきました。しかし今後、リクエストを適切な API サーバーに向わせる分散型の高パフォーマンス アーキテクチャに移行していくため、このようなグローバル エンドポイントはサポートは難しくなります。

        そこで来年、2019 年 3 月 25 日をもって、両機能のサポートを終了します。

        この変更によってお客様が影響を受けることは認識していますので、移行手順をできる限り明確にするための作業を行ってきました。移行に役立つ以下のガイダンスをぜひお読みください。

        行うべきこと

        Google API クライアント ライブラリは刷新され、Global HTTP Batch エンドポイントに対するリクエストを行わなくなりました。クライアントでこのライブラリを使っている場合、最新版にアップグレードする必要があります。Google API クライアント ライブラリを使っていないクライアントや、JSON-RPC エンドポイントまたは HTTP Batch エンドポイントに対してカスタム呼び出しを行っているクライアントでは、以下の変更を行う必要があります。

        JSON-RPC

        JSON-RPC を使っているかどうかを判断するには、https://www.googleapis.com/rpchttps://content.googleapis.com/rpcにリクエストを送っているかどうかを確認します。該当する場合、移行が必要になります。
        1. JSON-RPC エンドポイントを利用するクライアント ライブラリ(Google が公開しているライブラリまたはその他のライブラリ)を使っている場合は、API の REST エンドポイントと通信するクライアント ライブラリに切り替えます。

        2. Javascript のサンプルコード

          変更前
          // json-rpc request for the list method
          gapi.client.rpcRequest('zoo.animals.list', 'v2',
          name:'giraffe'}).execute(x=>console.log(x))

          変更後
          // json-rest request for the list method
          gapi.client.zoo.animals.list({name:'giraffe'}).then(x=>console.log(x))

          または
          1. クライアント ライブラリを使っていない場合(直接 HTTP をリクエストしている場合):
            1. REST URL を使い、
            2. リクエストの生成方法とレスポンスの解析方法を変更します。

          サンプルコード

          変更前
          // Request URL (JSON-RPC)
          POST https://content.googleapis.com/rpc?alt=json&key=xxx
          // Request Body (JSON-RPC)
          [{
          "jsonrpc":"2.0","id":"gapiRpc",
          "Method":"zoo.animals.list",
          "apiVersion":"v2",
          "Params":{"name":"giraffe"}
          }]

          変更後
          // Request URL (JSON-REST)
          GET https://content.googleapis.com/zoo/v2/animals?name=giraffe&key=xxx

          HTTP Batch

          同じ API を指定した内部リクエストの場合、バッチ リクエストの構造はすべて同じです。同じ API の異なるメソッドで処理される場合でも、同じ構造です。それぞれ異なる API を指定した内部リクエストの場合、異なる構造が混在します。Global HTTP Batch エンドポイントが終了すると、異なる構造が混在したバッチはサポートされなくなります。構造が均一なバッチは引き続きサポートされますが、 API 固有のバッチ エンドポイントによるサポートとなります。
          1. 現在、複数の構造が混在したバッチ リクエストを行っている場合:
            1. クライアントのコードを変更し、同じ構造のバッチ リクエストのみを送信するようにします。

          サンプルコード

          次のサンプルは、2 つの API(urlshortener と zoo)に対する構造が異なるバッチ リクエストを、構造が均一な 2 つのバッチ リクエストに分割する例を示しています。

          変更前
          // heterogeneous batch request example.

          // Notice that the outer batch request contains inner API requests
          // for two different APIs.

          // Request to urlshortener API
          request1 = gapi.client.urlshortener.url.get({"shortUrl": "http://goo.gl/fbsS"});

          // Request to zoo API
          request2 = gapi.client.zoo.animals.list();

          // Request to urlshortener API
          request3 = gapi.client.urlshortener.url.get({"shortUrl": "https://goo.gl/XYFuPH"});

          // Request to zoo API
          request4 = gapi.client.zoo.animal.get("name": "giraffe");

          // Creating single heterogeneous batch request object
          heterogeneousBatchRequest = gapi.client.newBatch();
          // adding the 4 batch requests
          heterogeneousBatchRequest.add(request1);
          heterogeneousBatchRequest.add(request2);
          heterogeneousBatchRequest.add(request3);
          heterogeneousBatchRequest.add(request4);
          // print the heterogeneous batch request
          heterogeneousBatchRequest.then(x=>console.log(x));

          変更後
          // Split heterogeneous batch request into two homogenous batch requests

          // Request to urlshortener API
          request1 = gapi.client.urlshortener.url.get({"shortUrl": "http://goo.gl/fbsS"});

          // Request to zoo API
          request2 = gapi.client.zoo.animals.list();

          // Request to urlshortener API
          request3 = gapi.client.urlshortener.url.get({"shortUrl": "http://goo.gl/fbsS"})

          // Request to zoo API
          request4 = gapi.client.zoo.animals.list();
          // Creating homogenous batch request object for urlshorterner
          homogenousBatchUrlshortener = gapi.client.newBatch();

          // Creating homogenous batch request object for zoo
          homogenousBatchZoo = gapi.client.newBatch();
          // adding the 2 batch requests for urlshorterner
          homogenousBatchUrlshortener.add(request1); homogenousBatchUrlshortener.add(request3);

          // adding the 2 batch requests for zoo
          homogenousBatchZoo.add(request2);
          homogenousBatchZoo.add(request4);
          // print the 2 homogenous batch request
          Promise.all([homogenousBatchUrlshortener,homogenousBatchZoo])
          .then(x=>console.log(x));



          または
        3. 現在、構造が均一なバッチ リクエストを実行しており、
          1. Google API クライアント ライブラリを使っている場合は、最新版にアップデートするだけです。
          2. Google 以外の API クライアント ライブラリを使っている場合、またはクライアント ライブラリを使っていない場合(直接 HTTP をリクエストしている場合):
            • エンドポイントを www.googleapis.com/batch から www.googleapis.com/batch/<api>/<version> に変更します。
            • または、単純に API のディスカバリ ドキュメントで「batchPath」の値を確認し、その値を使います。

        移行のサポートが必要な方は、API ドキュメントを確認するか、「google-api」タグを付けて Stack Overflow で質問してください。



        Reviewed by Eiji Kitamura - Developer Relations Team

        Angular コンポーネントから Route 特有のコードを綺麗にする

        $
        0
        0
        この記事は David East、デベロッパー アドボケートによる The Firebase Blog の記事 "Cleanse your Angular components of Route specific code" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。

        認証コンポーネントを構築するとき、ストレスを感じることがよくあります。非同期フローは管理しにくく、テンプレートは ngIf と Elvis 演算子で乱雑になってしまいます。
        {{ (user | async)?.uid }}

        ここで問題になることは、いつも同じです。あまりにも多くのことを 1 か所に詰め込みすぎているのです。適切なコードを適切な場所に配置するように整理すれば、快適なコードベースにすることができます。

        解決策: ルーティング特有のコードは、Angular の Route Guard に保存します。

        ステップ 1: コンポーネントの Route コードを特定する


        AngularFireAuthサービスは、ルーティングのコードとの相性が抜群です。この中には、現在のユーザーについての情報や、リダイレクトされたのかどうかなど、あらゆる情報が含まれています。

        単純な signInWithRedirectの例を見てみましょう。
        import { Component, OnInit } from '@angular/core';
        import { AngularFireAuth } from 'angularfire2/auth';
        import { Router } from '@angular/router';
        import * as firebase from 'firebase/app';

        @Component({
        selector: 'app-login',
        template: `
        <button class="btn" (click)="auth()">
        Login
        </button>
        `,
        styleUrls: ['./login.scss']
        })
        export class LoginComponent implements OnInit {

        constructor(
        private afAuth: AngularFireAuth,
        private router: Router
        ) { }

        ngOnInit() {
        this.afAuth.getRedirectResult().then(result => {
        if(result) {
        this.router.navigateByUrl('profile');
        }
        });
        }

        auth() {
        const provider = new firebase.auth.GoogleAuthProvider();
        this.afAuth.auth.signInWithRedirect(provider);
        }

        }

        この例で行っているのは、以下の内容です。
        1. ユーザーが auth()メソッドでログインします。
        2. Google でログインを行うため、signInWithRedirect()メソッドによってリダイレクトがトリガーされます。
        3. アカウントを選択すると、ユーザーはこのコンポーネントに戻されます。
        4. ユーザーのログインは、ngOnInit()内の getRedirectResult()で返される Promise によって解決されます。
        5. navigateByUrl()メソッドで、ルーターがユーザーをプロフィール ページに移動させます。

        コンポーネントが 1 つだけの場合、これでも問題はありません。しかし、複数のコンポーネントでリダイレクトを管理しなければならない場合を考えてみてください。

        ngOnInitのコードは、Route Guard に移すことができます。そうすると、ルーティング ロジックのコンポーネントを整理でき、Routerへの依存性を完全に削除することができます。

        ステップ 2: Route Guard の作成


        Route Guard には、さまざまな便利な使い方があります。今回は、リダイレクトのコードを扱います。
        @Injectable()
        export class RedirectGuard implements CanActivate {

        constructor(
        private authService: AngularFireAuth,
        private router: Router
        ) {}

        canActivate() {
        this.authService.auth.getRedirectResult().then(result => {
        if(result.user != null) {
        this.router.navigateByUrl('profile');
        return false;
        }
        return true;
        });
        }

        }

        canActivateメソッドは、ユーザーがルートにアクセスできるかを判定します。実際には、次のような処理が行われます。
        1. ユーザーがルートを開く。
        2. AngularFireAuthが、リダイレクト結果が存在するかどうかを確認する。
        3. ユーザーがリダイレクトから戻ってきた場合、'profile'ルートにルーティングする。
        4. そうでない場合、現在のルートに移動する。

        これで、コードを再利用できるようになります。Angular の Router を使うと、リッスンしてリダイレクトするルートを指定できます。
        import { Routes, RouterModule } from '@angular/router';
        import { LoginComponent } from './login/login.component';
        import { RedirectGuard } from './redirect.guard';

        const ROUTES: Routes = [
        {
        path: '',
        component: LoginComponent,
        canActivate: [RedirectGuard]
        },
        {
        path: 'profile',
        loadChildren: 'app/profile/profile.module#ProfileModule'
        }
        ];

        const AppRoutes = RouterModule.forRoot(ROUTES);

        export { AppRoutes }

        これで、LoginComponentからルーティングのコードをなくすことができます。
        @Component({
        selector: 'app-login',
        template: `
        <button class="btn" (click)="auth()">
        Login
        </button>
        `,
        styleUrls: ['./login.scss']
        })
        export class LoginComponent {

        constructor(private afAuth: AngularFireAuth) { }

        auth() {
        const provider = new firebase.auth.GoogleAuthProvider();
        this.afAuth.auth.signInWithRedirect(provider);
        }

        }

        非同期フローで乱雑になることはもうありません。適切なコードが適切な場所に配置されるように整理されたのです。アプリの拡大に合わせて、RedirectGuardに他のルートを追加することもできます。これでコンポーネントが複雑にならずにすみます。


        Reviewed by Yoshifumi Yamaguchi - Developer Relations Team

        Android Studio 3.1

        $
        0
        0
        この記事は Android プロダクト マネージャー、Jamal Eason  による Android Developers Blog の記事 "Android Studio 3.1" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
        
        Android Studio 3.1 が、安定したリリース チャンネルでダウンロードできるようになったことをお知らせします。今回のリリースで重点的に対応したのは、プロダクトの品質とアプリ開発の生産性に関する部分です。Android Studio 3.1 には、土台となる数多くの品質改善に加え、開発フローにぜひ組み込んでいただきたい新機能がいくつか追加されています。

        Android Studio 3.1 で初めて導入される機能は、アプリのコードのパフォーマンスに関するボトルネックのトラブルシューティングに役立つ C++ のパフォーマンス プロファイラです。アプリで Room または SQLite データベースを使っている方のために、SQL の表やクエリを作成する文のサポートが改善されたコード エディタも追加されています。また、Kotlin コードの Lint サポートが改善されているほか、クイックブート搭載の Android Emulator がアップデートされており、テストも高速化できます。これらの機能のいずれかに興味があるという方や、Android Studio の次の安定版を探しているという方は、すぐに Android Studio 3.1 をダウンロードしてみてください!

        Android Studio 3.1 の新機能の詳細については、重要なデベロッパー フローごとに分類された以下のリストをご覧ください。
        Android Studio 3.1 の新機能

        開発


        • Kotlin Lint チェック -昨年、Android プラットフォームにおける Kotlin 言語の公式サポートが発表されてから、Android Studio で Kotlin 言語をサポートするための作業が続けられてきました。Android Studio 3.1 では、Lint コード品質チェックが強化され、IDE からだけでなくコマンドラインからもチェックを実行できるようになりました。Android Studio プロジェクトを開き、コマンドラインから gradlew lintを実行するだけです。詳細をご覧ください

        コマンドラインからの Kotlin Lint チェック
        • データベース コードの編集 -Android Studio 3.1 では、Android プロジェクトでの SQL / Room Database コードのインライン編集がさらに簡単になっています。今回のリリースには、@Query宣言での SQL コード補完、SQL 文のリファクタリングの改善、プロジェクト全体を対象とした SQL コード ナビゲーションといった機能が搭載されています。詳細をご覧ください

        Room Database のコード補完
        • IntelliJ プラットフォーム アップデート - Android Studio 3.1 には、IntelliJ 2017.3.3 プラットフォーム リリースが含まれています。これには、新しい Kotlin 言語のインテンションや、SVG イメージ プレビューのビルトイン サポートなど、さまざまな新機能が搭載されています。詳細をご覧ください

        ビルド


        • D8 dex コンパイラー -D8 が Android Studio 3.1 のデフォルト dex コンパイラとなります。以前の DX コンパイラーに代わる D8 では、dex 処理が APK のコンパイル手順内で行われます。そのため、アプリサイズの縮小やデバッグ時の厳密なステップ実行が可能になり、多くの場合、ビルドも早くなります。gradle.properties で android.enableD8フラグを指定していないか、指定している場合は trueに設定されていることを確認してください。詳細をご覧ください
        • 新しいビルドの出力ウィンドウ - Android Studio 3.1 ではビルドの出力ウィンドウが更新され、ビルドのステータスやエラーが新しいツリービューの形で整理されるようになります。この変更により、以前の Gradle 出力も新しいウィンドウに統合されます。詳細をご覧ください

        新しいビルドの出力ウィンドウ

        テスト


        • クイックブート -クイックブートを使うと、Android Emulator セッションを 6 秒未満で再開できます。Android Emulator の起動の遅さは、皆さんからお聞きしていた大きな問題でした。それを解決するのがクイックブートです。物理 Android 端末と同じく、エミュレータも最初はコールドブートが必要になりますが、以降の起動は高速です。この機能は、デフォルトですべての Android Virtual Device で有効になっています。さらに、今回のリリースでは、いつクイックブートを利用するかを細かく制御できるようになっています。また、エミュレータの設定ページから、クイックブートの状態をオンデマンドで保存することも可能です。その他の主要な Android Emulator 機能の詳細をご覧ください。

        クイックブートのオンデマンド設定
        • システム イメージとフレームレス端末スキン - 最新版の Android Emulator では、API 24(Nougat)から API 27(Oreo)までのエミュレータ システム イメージで Google Play Store と Google API がサポートされます。また、P Developer Preview もサポートされます。さらに、端末エミュレータのスキンが更新され、新しいフレームレス モードで動作するようになります。このモードは、アプリで 18:9 のアスペクト比の画面や Android P Developer Preview の DisplayCutout API のテストを行う際に便利です。詳細をご覧ください

        Android Emulator のウィンドウ フレームレス モード

        最適化


        • C++ CPU プロファイリング -昨年、Android Studio 3.0 で、アプリの CPU、メモリ、ネットワーク アクティビティを計測できるまったく新しい Android プロファイラ群がリリースされました。Android Studio 3.1 では、Kotlin および Java 言語によるアプリのコードのパフォーマンス プロファイリングに加え、C++ コードのプロファイリングも行えるようになっています。C++ プロファイラは simpleperfをバックエンドとして利用しており、C++ メソッド トレースを記録できます。詳細をご覧ください

        C++ CPU Profiler
        • Network Profiler のアップデート: スレッドとネットワーク リクエスト -アプリのネットワーク トラフィックの分析に役立ててもらうため、マルチスレッド ネットワーク トラフィックを調査できる Network Thread ビューと、時系列でネットワーク リクエストの詳細を確認できる Network Request タブが新しく追加されています。このような Network Profiler のアップデートにより、個々のスレッドやネットワーク リクエストからネットワーク コールスタックまで、すべてのネットワーク トラフィックをトレースできる新たなツールが利用できるようになります。詳細をご覧ください

        スレッドがサポートされた Network Profiler

        Android Studio 3.1 に含まれる主な新機能をまとめます。

        開発
        • Kotlin の Lint チェック
        • データベース コードの編集
        • IntelliJ プラットフォーム アップデート

        ビルド
        • D8 dex コンパイラー
        • 新しいビルドの出力ウィンドウ

        テストとデバッグ
        • Android Emulator のクイックブート
        • API 27 搭載の Google Play エミュレータ システム イメージ
        • Android Emulator のウィンドウ フレームレス モード

        最適化
        • C++ Profiler
        • Network Profiler - スレッドのサポート
        • Network Profiler - リクエストのサポート

        詳細は、リリースノートをご覧ください。

        スタートガイド


        ダウンロード

        以前のバージョンの Android Studio を使っている方は、すぐに Android Studio 3.1 にアップグレードできます。または、公式の Android Studio のダウンロード ページからアップデートをダウンロードすることもできます。

        気に入った機能や問題点、新機能の提案などのフィードバックは大歓迎です。バグや問題を見つけた方は、ご遠慮なく問題を送信してください。Google+のページや Twitterで Android Studio 開発チームからの情報を常にチェックしてください。


        Reviewed by Yuichi Araki - Developer Relations Team

        Actions on GoogleのTransactions APIが日本語環境でも利用できるようになりました

        $
        0
        0
        Actions on Google の日本語対応開始以来、多くの開発者が Actions on Google で利用可能な機能を用いて様々な Google アシスタント向けアプリを公開をしています。その中でも、要望の多かった機能はトランザクション処理への対応でした。

        トランザクション処理をサポートする機能として Transactions API を限定公開し、ユーザーの個人情報のやり取りや決済などが発生することから、パートナー企業の協力のもと慎重に開発を続けて来ました。そして先日ご紹介原文)したとおり、日本でも一般公開しました。


          


        これまでは Actions on Google を用いての商品の購入、食料品の注文、予約といった処理は利用規約で制限されていましたが、 Transactions API を用いてこれらの処理が実現可能となりました。

        また、これらの処理にでは 3 つの決済方法に対応しています。
        • 決済が発生しない
        • 独自の決済システム [1]
        • ペイメントゲートウェイ [2]
        Transactions API を用いたトランザクション処理の実装は、次のような流れを想定しております。
        1. カートに商品を入れる
        2. 配送先等の情報の取得の確認を取る
        3. トランザクション(決済、予約など)の確認と処理を行う
        4. トランザクション結果を表示する

        詳細に関しては公式の開発者ドキュメント(英語のみ)をご参照ください。
        トランザクションを使って、多くのユーザーに新しい体験が提供されることを楽しみにしています。


        [1] Account Linkingを使った認証ができる想定をしています。
        [2] 本文公開時ではStripe、Adyen、Braintree、Vantiv が対応しております。各ペイメントサービスの日本での対応状況は各ペイメントサービスにて確認してください。


        Written by Yoshifumi Yamaguchi - Developer Relations Team

        TensorFlow での DeepLab によるセマンティック イメージ セグメンテーション

        $
        0
        0
        この記事は Google Research ソフトウェア エンジニア、Liang-Chieh Chen、Yukun Zhu による Google Research Blog の記事 "Semantic Image Segmentation with DeepLab in TensorFlow" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。

        セマンティック イメージ セグメンテーションとは、イメージ内のすべてのピクセルに「道路」、「空」、「人」、「犬」などといった意味のあるラベルを割り当てる処理のことです。これは、Pixel 2 および Pixel 2 XL スマートフォンのポートレート モードに搭載されている被写界深度を浅く見せる効果を合成によって作り出す機能や、モバイルによるリアルタイム動画セグメンテーションなど、さまざまな形で応用することができます。意味のあるラベルを割り当てるには、物体の輪郭をピンポイントで判別する必要があります。そのため、イメージレベルでの分類バウンディング ボックスレベルでの検知などによる視覚エンティティ認識タスクよりも、はるかに厳密に位置を検出しなければなりません。
        本日(*原文公開当時)は、私たちが誇る最新で最高のパフォーマンスを持つセマンティック イメージ セグメンテーション モデルである DeepLab-v3+ [1]*をオープンソースとしてリリースしたことをお知らせします。これは、TensorFlowを使って実装されています。今回のリリースには、最も正確な結果が得られるように、強力な畳み込みニューラル ネットワーク(CNN)バックボーン アーキテクチャ [2, 3] をベースに構築された DeepLab-v3+ モデルが含まれています。これは、サーバー側にデプロイすることを想定したものです。このリリースの一部として、TensorFlow モデルのトレーニングおよび評価用のコードと、セマンティック セグメンテーション処理のベンチマークである Pascal VOC 2012Cityscapesを使ってトレーニングを済ませたモデルも公開しています。

        初めての DeepLab モデル [4] は、3 年前に誕生しました。それ以来、CNN の特徴抽出の改善、オブジェクト スケーリング モデルの向上、コンテキスト情報の正確な利用、トレーニング手続きの改善、さらに強力になったハードウェアとソフトウェアによって、改善が加えられた DeepLab-v2 [5] や DeepLab-v3 [6] が生まれています。DeepLab-v3+ は DeepLab-v3 を拡張したもので、シンプルかつ効果的なデコーダ モジュールが追加されており、特に物体の境界付近のセグメンテーション処理の精度が上がっています。さらに、Atrous 空間ピラミッド プーリング [5, 6] とデコーダ モジュールの両方に対し、深さ方向に畳み込みを分解する Depthwise Separable Convolutionを適用することにより、高速で強力なセマンティック セグメンテーション用エンコーダデコーダ ネットワークを実現しています。
        畳み込みニューラル ネットワーク(CNN)をベースとした最新のセマンティック イメージ セグメンテーション システムは、手法、ハードウェア、データセットが進化したことにより、5 年前ですら想像できなかったレベルの精度に達しています。このシステムがコミュニティに広く公開されることで、学会や産業界の他のグループによる最新のシステムの再現や改善、新しいデータセットを使ったモデルのトレーニング、このテクノロジーを活用する新たなアプリケーションの構想などが推進されることを期待しています。

        謝辞
        サポートと価値ある議論を提供してくれた Iasonas Kokkinos 氏、Kevin Murphy 氏、Alan L. Yuille 氏(DeepLab-v1 および -v2 の共著者)に感謝いたします。また、Mark Sandler 氏、Andrew Howard 氏、Menglong Zhu 氏、Chen Sun 氏、Derek Chow 氏、Andre Araujo 氏、Haozhi Qi 氏、Jifeng Dai 氏、そして Google Mobile Vision チームにも感謝を捧げます。

        参考文献
        1. Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation, Liang-Chieh Chen, Yukun Zhu, George Papandreou, Florian Schroff, and Hartwig Adam, arXiv:1802.02611, 2018.
        2. Xception:Deep Learning with Depthwise Separable Convolutions, François Chollet, Proc. of CVPR, 2017.
        3. Deformable Convolutional Networks — COCO Detection and Segmentation Challenge 2017 Entry, Haozhi Qi, Zheng Zhang, Bin Xiao, Han Hu, Bowen Cheng, Yichen Wei, and Jifeng Dai, ICCV COCO Challenge Workshop, 2017.
        4. Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs, Liang-Chieh Chen, George Papandreou, Iasonas Kokkinos, Kevin Murphy, and Alan L. Yuille, Proc. of ICLR, 2015.
        5. Deeplab:Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs, Liang-Chieh Chen, George Papandreou, Iasonas Kokkinos, Kevin Murphy, and Alan L. Yuille, TPAMI, 2017.
        6. Rethinking Atrous Convolution for Semantic Image Segmentation, Liang-Chieh Chen, George Papandreou, Florian Schroff, and Hartwig Adam, arXiv:1706.05587, 2017.


        * DeepLab-v3+ は、Pixel 2 のポートレート モードやリアルタイム動画セグメンテーションには利用されていません。投稿の中では、このタイプのテクノロジーで実現できる機能の例として触れられています。




        Reviewed by Haruka Iwao, Developer Advocate, Google Cloud

        AdWords スクリプトが v201802 レポートをサポート

        $
        0
        0
        この記事は AdWords API チーム、Mike Cloonanによる Google Ads Developer Blog の記事 "Support for v201802 reports in AdWords scripts" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
        
        AdWords スクリプトで AdWords API v201802 レポートがサポートされるようになりました。このリリースの主な変更点は、次のとおりです。
        • 新しいレポート種別 LANDING_PAGE_REPORTが追加されました。これにより、広告からトラフィックを受け取るページのパフォーマンス統計が提供されます。
        • さまざまなレポートに ConversionLagBucket フィールドが追加されました。これは、ユーザーのコンバージョンにかかる時間の判断に役立ちます。
        • Gmail 広告をサポートするための新しいフィールドが追加されました。
        ここに記載されていない追加機能など、完全な情報については、AdWords API リリースノートをご覧ください。

        レポートで API のバージョン管理を使っている場合は、v201802 を使うようにコードを変更する必要があります。
        var report = AdWordsApp.report(query, {
        apiVersion: 'v201802'
        });
        API のバージョン管理を使っていない場合は、コードを変更する必要はありません。この変更と合わせて、デフォルトのレポート バージョンが v201710 にアップデートされています。皆さんのレポートは、自動的にアップグレードされます。

        今回の変更や、一般的な AdWords スクリプトに関する質問がある方は、デベロッパー フォーラムに投稿してください。


        Reviewed by Thanet Knack Praneenararat - Ads Developer Relations

        Wear OS by Google デベロッパー プレビュー

        $
        0
        0
        この記事は Wear OS by Google リード デベロッパー アドボケート、Hoi Lam による Android Developers Blog の記事 "Wear OS by Google developer preview " を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。


        本日(*原文公開当時)、Wear OS by Google のデベロッパー プレビューがリリースされ、Android P のプラットフォーム機能がウェアラブルに導入されます。このデベロッパー プレビューには、アップデートされた公式 Android Emulator システム イメージと、ダウンロード可能な Huawei Watch 2 Bluetooth や Huawei Watch 2 Classic Bluetooth 用のシステム イメージが含まれています。この第 1 弾リリースは、デベロッパーのみを対象としています。日常的な使用やユーザーの使用を想定したものではありません。そのため、手動でのダウンロードと書き込みによってのみ入手できます。リリースノートで既知の問題を確認してから、端末でダウンロードと書き込みを行ってください

        このリリースでデベロッパーに注目していただきたい機能は、以下のとおりです。
        • 非 SDK メソッドおよびフィールドに関する制限: アプリの互換性を向上させるため、Android P では非 SDK メソッドおよびフィールドに対するアクセスを制限する処置が開始されています。デベロッパーは、そのようなアクセスを回避するための移行計画を立てる必要があります。一般公開されている内容にあてはまらないケースについては、お知らせください
        • Dark UI システムテーマ: 今年初めより、視認性向上のため、Wear OS の通知ストリームやシステム ランチャーの UI テーマは、背景色が暗いブラック系に切り替わっています。システムテーマでもこの色がデフォルトになるので、Wear アプリの視認性が向上するはずです。デベロッパーは、変更後のアプリの UI アクセシビリティについて確認する必要があります。
        • バックグラウンド アクティビティの制限: 電力効率を高めるため、時計が充電されている場合を除き、アプリはバックグラウンドで動作できなくなります。Wear OS では、Android のアプリ スタンバイ機能により、他のフォーム ファクタよりも制限が強化されている点に注意してください。なお、現在ユーザーが選択しているウォッチフェイスウォッチフェイスの追加機能などは例外です。この機能は、デベロッパー プレビューで徐々に公開されます。そのため、すぐに端末で効果を確認できない場合もありますが、バックグラウンド サービスを削除した適切なアプリを構築する必要があります。
        • 身につけていない場合、無線通信をオフ: 電源効率を高めるため、長時間時計を身につけていないことが検知されると、Bluetooth、Wi-Fi、携帯用無線通信がオフになります。この機能も徐々に公開される予定なので、最初のうちは端末上で効果を確認できない場合があります。この機能によって開発プロセスが難しくなる場合は、adb 経由で機能を無効化することもできます。リリースノートの手順に従ってください。
        • BT に接続されていない場合、Wi-Fi をオフ: 電源効率を高めるため、端末は Bluetooth に接続されていない場合に Wi-Fi に自動接続しなくなります。アプリが高帯域幅ネットワークをリクエストしている場合や、時計が充電されている場合などは例外です。この機能は徐々に公開される予定なので、最初のうちは端末上で効果を確認できない場合があります。

        フィードバックをお待ちしています


        このプレビューにはいくつかのアップデートが行われ、その後、最終的な製品版がリリースされる予定です。見つけたバグは、Wear OS by Google の Issue Trackerからお送りください。早く送っていただければ、それだけ最終リリースにバグの修正が含まれる可能性が高くなります。



        Reviewed by Yoshifumi Yamaguchi - Developer Relations Team

        韓国の済州島で Deep Learning Camp を開催します

        $
        0
        0


        昨年行われ好評を博した Deep Learning Camp Jejuを今年も 7 月 2 日より開催します。

        この、韓国の済州島で行われる Deel Learning トレーニング キャンプでは、1 か月の間、Deep Learning を学びながら他の参加者と寝食を共にします。昨年は、633 名の応募者の中から選ばれた 20 名が切磋琢磨し合い、Deep Learning に関する知識を深めました。業界のエキスパート 20 名が講師として招かれ、現地で、もしくは Hangouts を通して参加者に知識を共有しました。

        研究課題の一部:Self driving car simulator, Sketch simplification, Separating voice from a song


        開催概要



        日程
        2018 年 4 月 30 日 応募締め切り
        2018 年 5 月 21 日 当選者発表
        2018 年 6 月 1 日 オンライン Camp 開始
        2018 年 7 月 2 日 済州島でのキックオフ
        2018 年 7 月 31 日 最終プレゼンテーション


        募集から参加までの流れ
        応募者は研究課題を提案します。それらを主催者側にて審査します(2017 年の課題一覧
        参加者は、メンターのサポートを受けながら、キャンプが始まる前の 1 か月の間、課題に各自で自分の研究課題に取り組みます。
        キャンプ開始後は、済州島の現地において、研究課題に取り組みます。
        キャンプの終わりには、参加者はプロジェクトの成果を提示することが求められます。

        募集要件
        キャンプ開催期間中、済州島に滞在できること
        TensorFlow(TF)および Deep Learning(DL)のバックグラウンドを持ち、十分なプログラミング スキルがあること
        メンターとともに、1 か月間、集中的に研究課題に取り組む意欲があること
        TF/DL の実践的なアプリケーションを作り出そうとする意欲があること

        応募方法
        こちらのフォームからお申し込みください。

        参加者には、宿泊費として 1,000 US ドル、航空券代は 300 US ドルまでのサポートと、TPU アクセスがついた Google Cloud クレジット1,000 US ドル分が提供されます。

        皆様のご応募をお待ちしています。


        Posted by Takuo Suzuki - Developer Relations Team

        INEVITABLE ja night 第 4 回のご案内

        $
        0
        0

        Google Cloud に代表されるクラウド技術の進化が引き起こすその先の世界を、機械学習、VR / AR、IoT などの領域で活躍されているスタートアップの方々と一緒に議論するイベント「INEVITABLE ja night」。

        今回は音声対話インタフェース:VUI(Voice User Interface)をテーマに、「VUI がもたらす UX(ユーザー体験)の不可避な流れ」と題して開催します。スマートフォンやスマートスピーカーなどにおいて VUI の重要性が高まっています。永らくキーボードが主体だったデバイスやコンピューターへの入力環境が大きく変わるのか? それが UX やエコシステムに及ぼす影響は? AI との親和性も含め、VUI が不可避な流れとなるかについて議論していきます。

        VUI に関するテクノロジーやビジネスにご興味のあるビジネス企画者、スタートアップ企業の方々のご参加をお待ちしています。

        【開催概要】
        イベント名 : INEVITABLE ja night - “インターネットの次にくるもの”
           第 4 回 VUI がもたらす UX の不可避な流れ
        日程 : 2018 年 5 月 23 日(水) 19:00 〜 21:00(開場 18:30 より)
        会場 : グーグル合同会社
        定員 : 200 名
        ハッシュタグ : #inevitableja
        プログラム :
        INEVITABLE 対談
           スピーカー:岩佐 琢磨 氏(株式会社Shiftall 代表取締役CEO)
           聞き手:小島 英揮 氏(Still Day One合同会社 代表社員 パラレルマーケター・エバンジェリスト)
        VUI テクノロジーアップデート& VUI ビジネストレンド紹介
           スピーカー:安藤 幸央 氏(株式会社エクサ、Google Developer Expert(Maps)、Google 認定スプリントマスター)

        ※その他、調整中
        講演後は講師や参加者の皆さんとの交流や情報交換をお楽しみください。

        参加を希望される方は、お申し込みサイトをご覧ください。

        皆様のご参加をお待ちしております。

        Posted by Takuo Suzuki - Developer Relations Team

        まもなく AdWords と DFP の Java クライアント ライブラリで Java 8 以降が必須に

        $
        0
        0
        この記事は AdWords API チーム、Josh Radcliff による Google Ads Developer Blog の記事 "AdWords and DFP client library for Java will soon require Java 8+" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
        
        2018 年 7 月 1 日より、Google Ads API Client Library for Javaのすべてのリリースの互換性が Java 8(1.8)以降のみとなります。


        変更の理由

        この変更の主な理由は、以下のとおりです。
        • Java 7 が最初にリリースされたのは 2011 年 7 月で、Oracle による Java 7 の主なサポート終了日も近づいています
        • Java 7 のサポートを続ける場合、ラムダ式、デフォルト メソッド、コレクションのストリーム API サポートなどの Java 8 の便利な機能をコードサンプルで利用できません。
        • クライアント ライブラリで Java 9 をサポートするには、いくつかの依存性を Java 7 をサポートしていない可能性があるバージョンにアップデートすることが必要になります。
        • Google Ads API Java Client Library のデベロッパーが Java 7 を利用するケースは減少し、ほとんどのユーザーが Java 8 以降を利用しています。


        次のステップ


        Java 8 以降を使っている方は、何もする必要はありません。

        まだ Java 7 を使っている方は、ランタイムを Java 8 以降に移行する必要があります。詳しくは、Oracle の Java 8 導入ガイドをご覧ください。

        ご質問がある場合は、ライブラリの Issues ページに問題を記述するか、Google+ ページからお問い合わせください。


        Reviewed by Thanet Knack Praneenararat - Ads Developer Relations

        AMP ページでサイト運営者によるユーザー制御の実装が可能に

        $
        0
        0
        この記事は AMP プロダクト マネージャー、Rudy Galfi による Accelerated Mobile Pages Project の記事 "Enabling publishers to implement user controls on AMP pages" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
        
        最近のユーザーは、オンライン エクスペリエンスをさらに制御することを望んでいます。また、サイト運営者は、ベンダーのポリシーに関することから、まもなく開始される EU一般データ保護規則(GDPR)などのますます高度になる法的要件に関することまで、ユーザーに通知や選択を提供する方法について多様な要望を受けています。オープンソースの AMP Project は、AMP ページでサイト運営者や技術ベンダーが適切なユーザー制御を実装し、異なる個々のコンプライアンス要件をサポートできるツールを提供するための作業を行っています。

        現在開発中の新しいコンポーネントは、近日中に AMP ページに組み込んで利用できるようになる予定です。これによって、サイト運営者がウェブサイトに必要と考える通知、選択、同意のフローを簡単に実装できるようになります。リリースされる予定の機能には、「同意する」および「同意しない」という意味を持つ選択肢をユーザー インターフェースの通知に表示する機能や、ユーザーの選択に応じて AMP 要素の動作を設定できる機能が含まれています。さらに詳しく知りたい方、コメントしたい方、最新の情報を受け取りたい方は、該当する GitHub Issueをご確認ください。

        ユーザー制御を実装して GDPR などの法の遵守を実現するアプローチは、サイト運営者によって異なります。そのため、皆さん全員が AMP Project の GitHub 上で要件に関するやり取りをされるお勧めします。特定の機能のリクエストや、プロジェクトのアイデアはいつでも大歓迎なので、新しい Issue を登録してください。

        また、AMP は、アナリティクス、広告技術、動画プレイヤーやその他の埋め込みコンテンツなど、100 以上のベンダー提供機能をサポートしています。ベンダーに AMP のユーザー制御機能を組み込んでもらいたいとお考えのサイト運営者の方は、AMP Project を確認するようベンダーにお伝えください。

        今後数週間のうちに、サイト運営者が新しいコンポーネントを実装する際に役立つドキュメントやサンプルを公開します。今後も詳細についてお知らせする予定なので、本ブログの更新にご注目ください。

        Reviewed by Yoshifumi Yamaguchi - Developer Relations Team

        第 4 回 Google Cloud INSIDE Games & Apps 開催のお知らせ

        $
        0
        0

        Google Cloud では 2018 年 6 月 7 日 (木) 、ゲーム業界で活躍するインフラエンジニア、サーバーアプリケーションエンジニア、テクニカルリーダーを対象に「第 4 回 Google Cloud INSIDE Games & Apps」を開催します。

        『 ゲーム開発の裏側 』をコンセプトに、業界で活躍する方々や深い専門知識をもつ Google 社員をゲストスピーカーとして迎え、テクノロジーを中心にプロダクトやサービスの裏側を語っていただきます。

        今回は、“GCP for Gaming 事例とともに、まるっと解説 !” をテーマに、より実践的な技術を、ゲストスピーカーの方々にご紹介いただきます。また Google 社員から関連するプロダクトを解説します。



        ■開催概要

        名 称:Google Cloud INSIDE Games & Apps
        会 期:2018 年 6 月 7 日 (木) 16 : 00 - 19 : 00
        会 場: 渋谷ヒカリエ ヒカリエホール A
        〒150-8510 東京都渋谷区渋谷 2 丁目 21 - 1
        http://www.hikarie.jp/access/


        スピーカー:

        • 株式会社バンダイナムコエンターテインメント
          NE事業部 プロダクションディビジョン
          第1プロダクション プロデュース4課 マネージャー 河原 真太郎 氏
        • Niantic, Inc.
          『ポケモン GO』ゲームディレクター/シニアプロダクトマネジャー 野村 達雄 氏
        • Google Cloudゲームテクニカルスペシャリスト サミール ハムディ
        ※他調整中

        プログラム:


        15 : 30 受付開始
        16 : 00 - 19 : 00 講演およびパネルディスカッション

        主 催: グーグル・クラウド・ジャパン合同会社
        定 員:650 名
        参加費 : 無料 (事前登録制)

        詳細・参加申し込み :


        https://goo.gl/wQyYAA

        上記リンクからお申し込みください。
        ※ お申込み締め切り: 2018 年 5 月 22 日(火)15 : 00まで


        ※ 競合他社様、パートナー企業様からのお申し込みはお断りさせていただくことがございます。
        ※ 報道関係者のご参加はお断りさせていただきます。
        ※ ビジネス向けのイベントとなっております。学生の方のご参加はご遠慮ください。

        ※ お申し込み多数の場合は抽選を行います。参加いただける方には、後日、ご登録されたメールアドレスに参加のご案内をお送りします。


        Posted by Takuo Suzuki - Developer Relations Team
        Viewing all 2208 articles
        Browse latest View live