Google I/O 2018

参加報告

SRA 産業第1事業部 鈴木真吾

アジェンダ

  • 発表者について

  • Google I/O とは

  • Google I/O の内容

  • Google I/O に参加しよう 

発表者について

  • 鈴木真吾(@giantneco)

  • 所属: 産業第1事業部

  • 言語: Go, C, Scala, etc

  • Google I/O

    • Google I/O 2016 に続いて 2 回目の参加

Google I/O とは

Google 開催の年次開発者向けイベント

  • 毎年 5 月頃に開催

  • マウンテンビューの Google 本社近くで開催

  • メインは Android, Web など

    • アプリ開発者向け

    • クラウド関連は別のイベントがある

    • TensorFlow も別のイベントがある

Google I/O の内容

どんなことをやっているか?

  • キーノート

  • セッション

  • コードラボ

  • サンドボックス

  • コミュニティミートアップ

  • アフターパーティー

etc

 

キーノートで反響が大きかった発表

  • Google Duplex

    • ​Google Assistant が音声で予約を行ってくれた

    • 受け答えがかなり自然

  • Android P beta

    • Google 以外の会社もベータに対応

    • 今後、各社端末の新OS対応が早まるかも

  • Android Jetpack

    • ​開発環境結構変わりそう

セッション

いわゆる講義形式のもの

 

3 日間で 164 件のセッションがある

主なセッションとして

  • Android&Play ... 58件

  • Web                 ... 30件

  • ML&AI             ... 16件

 

入場者数の一部が予約制になって待ち時間がかなり短縮された。

コードラボ

用意された環境でデモを作成して学習できる

 

  • Mac + Pixel で開発ができる

  • 実機持ち込みも可能

  • セッションで聞いた内容をすぐに試すことができる

  • 直接 Googler に質問できる

サンドボックス

さまざまなデモの展示

 

  • VR&AR

    • 人気

  • Google Assistants

  • etc

 

実機が置いてあったり、インタラクティブなデモを遊べたりして結構楽しい

サンドボックス色々

コミュニティ

ミートアップ

ミートアップイベントも開催

  • 技術分野ごとのミートアップ

    • クラウド, Firebase etc

  • 出身地域別のミートアップ

    • 他の日本からきた開発者とはここで出会えるチャンス!

食事

野生動物

After Party

おみやげ

今年は

  • Google Home Mini

  • Android Things Starter Kit

がもらえた。

参加した感想

  • 楽しい

  • 2016 に比べて運営は格段によくなっている

    • 待ち時間の短縮

    • 給水ポイント

    • アルコール飲めるかどうかは事前確認制

  • 日本人も結構来ている

  • 現地でしかできないことをやったほうがいい

    • Codelabs とか行ってよかった

Google I/O に参加しよう!

  • 現地でしかできない体験はある

  • 同時期に SF で他のイベントがある

    • Maker faire

    • Day 0 Party

  • 抽選の登録は 2月末あたり

  • 参加人数が多いので、割と当たる確率は多そう

参加することになったら

  • 宿泊地

    • サンノゼあたりは宿泊料高くなってる
    • 今年はサンフランシスコのほうが宿泊料安かったらしい

    • 多分 AirBnb が一番安く済む
  • 交通手段

    • Uber or Lyft

      • 期間中は Google のクーポンがある 

    • Caltrain 本数少ないので注意

    • 24 時間運行のバスがあるが、深夜は客層に注意

参加する場合の注意点

現地天候への対策

  • 昼は暑く、夜は寒い

    • 休める物陰は増えたが、日焼けどめ必須

    • 夜はかじかむぐらい冷えるので羽織れるもの

  • アレルギーある人は注意

    • 屋外なので花粉が飛んでいる

    • 野鳥が多いので、羽毛などにアレルギーがある場合

Intel's Google I/O Day 0 Party

Intel Google I/O 参加者向けパーティー

  • 無料の食べ物とアルコール

  • Intel エンジニアのデモが見られる

Day 0 Party Demo

  • AI 関連

    • Project Celadon

    • Intel Computer Vision SDK

    • Movidius

  • IoT

    • Intel System Studio

    • Sawtooth Core

他、Chrome, VR&AR なども

Intel's Day 0 Party

機械学習のデモが多かった

  • Rasberry Pi + Movidius による物体検出

  • 駐車場カメラに使う空きスペース検知

 

方向性としては IoT + ML が多い印象

Google I/O 2018

Android

Agenda

  • Android Jetpack

    • Support Library

    • Navigation

    • Paging

    • Slices

    • Work Manager

    • Android KTX

  • ​その他

Android Jetpack

Android Jetpack は開発を効率化するツール&ライブラリ

  • Support Library & Architecture Components の後継

  • それぞれのコンポーネントは個別に採用できる

Support Library AndroidX

Support ライブラリは androidx の名前空間に統合される

android.support.* androidx.*

 

バージョンの整理

  • バージョンの巻き戻し( 28.0.0 → 1.0.0 )

    • Support ライブラリは 28.0.0 stable が最後

  • Semantic Versioning の採用

 

パッケージルールの変更

  • androidx.<feature>.ClassName

Navigation

アプリ内のナビゲーションに必要なものを提供

  • Navigation Graph

    • 画面遷移を示す XML

    • GUIで画面遷移設計できる

  • DeepLink とそのバックスタックの解決

Navigation Graph

Navigation XML

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            xmlns:tools="http://schemas.android.com/tools"
            app:startDestination="@+id/launcher_home">
    <fragment
        android:id="@+id/launcher_home"
        android:name="com.example.android.codelabs.navigation.MainFragment"
        android:label="@string/home"
        tools:layout="@layout/main_fragment">

        <action
            android:id="@+id/next_action"
            app:destination="@id/flow_step_one"
            app:enterAnim="@anim/slide_in_right"
            app:exitAnim="@anim/slide_out_left"
            app:popEnterAnim="@anim/slide_in_left"
            app:popExitAnim="@anim/slide_out_right" />
    </fragment>

    <fragment
        android:id="@+id/flow_step_one"
        android:name="com.example.android.codelabs.navigation.FlowStepFragment"
        tools:layout="@layout/flow_step_one_fragment">
        <argument

Navigation

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        // Set NavOptions
        val options = NavOptions.Builder()
            .setEnterAnim(R.anim.slide_in_right) // Override navigation animation
            .setExitAnim(R.anim.slide_out_left)
            .setPopEnterAnim(R.anim.slide_in_left)
            .setPopExitAnim(R.anim.slide_out_right)
            .build()

        view.findViewById<Button>(R.id.navigate_dest_bt)?.setOnClickListener {
            findNavController(it).navigate(R.id.flow_step_one, null, options)
        }

        // Update the OnClickListener to navigate using an action
        view.findViewById<Button>(R.id.navigate_action_bt)?.setOnClickListener(
            Navigation.createNavigateOnClickListener(R.id.next_action, null)
        )
    }

Deeplink

Bundle args = new Bundle();
args.putString("myarg", "From Widget");
PendingIntent pendingIntent = new NavDeepLinkBuilder(context)
    .setGraph(R.navigation.mobile_navigation)
    .setDestination(R.id.android)
    .setArguments(args)
    .createPendingIntent();

remoteViews.setOnClickPendingIntent(R.id.deep_link, pendingIntent);
  • Deeplink のバックスタックは navigation graph から自動的に導出される。

Paging

Recycler View に使える遅延読み込みライブラリ

 

  • ネットワーク、DB などから遅延読み込み

  • RXJava サポートあり

 

Paging sample

class ConcertViewModel {
    fun search(query: String): ConcertSearchResult {
        val boundaryCallback =
                ConcertBoundaryCallback(query, myService, myCache)
        // Error-handling not shown in this snippet.
        val networkErrors = boundaryCallback.networkErrors
    }
}

class ConcertBoundaryCallback(
        private val query: String,
        private val service: MyService,
        private val cache: MyLocalCache
) : PagedList.BoundaryCallback<Concert>() {
    override fun onZeroItemsLoaded() {
        requestAndSaveData(query)
    }

    override fun onItemAtEndLoaded(itemAtEnd: Concert) {
        requestAndSaveData(query)
    }
}

WorkManager

バックグランドジョブ管理ライブラリ

  • これまであったバックグラウンドジョブ

    • JobScheduler

    • Firebase Jobdispatcher

    • AlarmManager

  • 柔軟なジョブ管理ができる

    • 制限の設定

    • 定期的な実行

    • 重複時の挙動設定

WorkManager

class CompressWorker : Worker()  {
    override fun doWork(): WorkerResult {
        myCompress()
        return WorkerResult.SUCCESS
    }
}
val compressionWork = OneTimeWorkRequestBuilder<CompressWorker>().build()
WorkManager.getInstance().enqueue(compressionWork)

Worker

WorkManager への登録

Task constraints

val myConstraints = Constraints.Builder()
        .setRequiresDeviceIdle(true)
        .setRequiresCharging(true)
        // Many other constraints are available, see the
        // Constraints.Builder reference
        .build()

val compressionWork = OneTimeWorkRequestBuilder<CompressWorker>()
        .setConstraints(myConstraints)
        .build()

Work を開始する条件を設定できる

  • 設定できる条件は色々用意されている
    • ネットワークに接続された場合
    • 給電されている場合
    • etc

Chained Task

WorkManager.getInstance()
    .beginWith(workA)
        // Note: WorkManager.beginWith() returns a
        // WorkContinuation object; the following calls are
        // to WorkContinuation methods
    .then(workB)    // FYI, then() returns a new WorkContinuation instance
    .then(workC)
    .enqueue()

Worker をつなげることができる

  • 上記の例だと workA, workB, workC の順番で逐次実行される
  • 並列実行なども可能

Slices

Google Search Google Assistants の表示に、自作アプリの情報を出す仕組み

  • まだユーザは使えないが実装は可能

    • 確認には slice viewer を使用する

  • 例えば右のような表示を"trip"で検索した時に表示するようなことができる

Slices

    <application
        ...

        <!-- To provide slices you must define a slice provider -->
        <provider
            android:authorities="com.android.example.slicecodelab"
            android:name=".MySliceProvider"
            android:exported="true">
        </provider>

        ...
    </application>

AndroidManifest.xml

Slices

public class MySliceProvider extends SliceProvider {
    @Override
    public boolean onCreateSliceProvider() {
        return true;
    }

    public Slice onBindSlice(Uri sliceUri) {
        switch(sliceUri.getPath()) {
            case "/temperature":
                return createTemperatureSlice(sliceUri);
        }
        return null;
    }

    @Nullable
    private Slice createTemperatureSlice(Uri sliceUri) {
        // ...
    }
}

SliceProvider

Slices

    private Slice createTemperatureSlice(Uri sliceUri) {
        ListBuilder listBuilder = new ListBuilder(getContext(), sliceUri, ListBuilder.INFINITY);

        // Construct the builder for the row
        ListBuilder.RowBuilder temperatureRow = new ListBuilder.RowBuilder(listBuilder);

        // Set title
        temperatureRow.setTitle(MainActivity.getTemperatureString(getContext()));

        // Add the row to the parent builder
        listBuilder.addRow(temperatureRow);

        // Build the slice
        return listBuilder.build();
    }

Sliceの生成

Android KTX

Kotlin らしく Android アプリを作成するためのライブラリ

  • より Kotlin らしい API

  • パッケージ名は*-ktx
    • fragment-ktx -> fragment

    • collection-ktx -> collection 

Anroid KTX

// In an Activity, on API 23+
val notification = getSystemService(NotificationManager::class.java)

// or all API level
val notification = ContextCompat.getSystemService(this,
    NotificationManager::class.java)
val notification = systemService<NotificationManager>()

KTX を使うと次のようにかける

Android KTX

KTX Principles

👍 既存の機能に合わせて、上流の機能にリダイレクトする

👍 サイズ、アロケーションで問題にならない限り inline にする

👍 Kotlin 特有の機能を活用する

👎 コードゴルフ API は避ける

👎 単一 and/or 特定の利用法のための最適化は避ける

 

Android KTX

Kotlin フレンドリーな Java ライブラリを作る場合

  1.  Kotlin から使いやすいような API を作る
  2.  Kotlin 拡張のライブラリを同梱する
  3.  KEEP-110 (Kotlin 1.1.6 で一部実装)
    • Kotlin Evolution Enhancement Process​
    • Kotlin から呼び出しやすくする仕組み

 

KEEP-110

  • @ExtensionFunction
  • @ExtensionProperty
  • @KtName
  • @DefaultValue

KEEP-110

class TextUtil {
    @ExtensionFunction
    @ktName("isDigitsOnly")
    public static boolean isDisigtsOnlyString(@NonNull CharSequence str) {
        // ...
    }
}
val onlyDigits = phoneNumber.isDigitsOnly()

Java

Kotlin

その他話題になっていたもの

  • Android App Bundle/Dynamic Feature Module

    • ​Android アプリのモジュール化
  • Test Support Library → Android Testing
    • JVM, 実機で同じコードでテストが可能に
  • Material Theming
    • Material Component がカスタマイズ可能になった
  • Flutter
    • beta 3 が出た
  • Android Studiot 3.2
    • パフォーマンスモニタ, サンプル表示, Constraint Layout 2.0

まとめ

  • Android Jetpack

    • 開発環境は大きく変わりそう

      • ​aab でモジュールを意識した設計が必要になるかも​
      • Support Library としては 28.0.0 が最後なので注意

    • すぐに使えそうなものも多い印象

      • TypeSafeArugment とか...

  • Kotlin 結構使われている様子

    • 現時点で Google Play にあるアプリの 35 % が Kotlin 採用

    • Google I/O のサンプルコードでもかなり Kotlin が使われてた

  • Codelabs での学習はおすすめできる

Google I/O 2018

ML & AI

ML & AI

  • TensorFlow

    • TensorFLow Hub

    • TensorFlow Serving

    • TensorFlow Extended

    • TensorFlow.js 

  • ML Kit

  • AIY

TensorFlow dev summit 

4 月にあったばかりなので、初出の情報はあまりない

TensorFlow Hub

TensorFlow の再利用可能なモジュールのリポジトリ

  • 学習済みのものを使えば学習コストが安く済む場合がある(転移学習)

  • 利用可能なモジュールは

    • Image Module

    • Text Module (日本語が対象のものもある)

            など

TensorFlow Hub

$ pip install "tensorflow>=1.7.0"
$ pip install tensorflow-hub

TensorFlow Hub

import tensorflow as tf
import tensorflow_hub as hub

# ...

# Download and use NASNet feature vector module.
module = hub.Module
    "https://tfhub.dev/google/imagenet/nasnet_large/feature_vector/1")
#    62,000+ GPU hours!
 

features = module(my_images)
logits = tf.layers.dense(features, NUM_CLASSES)
probabilities = tf.nn.softmax(logits)

Hub にあるモジュールはそのまま使うことができる

TensorFlow Hub

import tensorflow as tf
import tensorflow_hub as hub

# ...

# Download and use NASNet feature vector module.
module = hub.Module
    "https://tfhub.dev/google/imagenet/nasnet_large/feature_vector/1",
    trainable=True, tags={"train"})

features = module(my_images)
logits = tf.layers.dense(features, NUM_CLASSES)
probabilities = tf.nn.softmax(logits)

転移学習することも可能

TensorFlow Serving

TensorFlow を製品レベルで運用するためのサーバとAPI

  • モデルサーバ

    • モデルの管理を行う

    • 複数モデルを同時に扱える

    • モデルの動的ロード/アンロード

  • 推論 API

    • gRPC

    • REST API

TensorFlow Extended (TFX)

TensorFlow-base の汎用かつスケーラブルな

機械学習プラットフォーム

引用:TFX: A TensorFlow-Based Production-Scale Machine Learning Platform

TensorFlow.js

  • TensorFlow JavaScript

  • なぜ Javascript か?

    • インストールなしで使える

    • ブラウザで使えると、大抵の場合カメラやセンサーが使える→機械学習が活かしやすい

  • パフォーマンスはよい

    • node.js でネイティブの TensorFlow に匹敵するくらいの性能は出てた

TensorFlow.js の利用例

TensorFlow.js

      const model = tf.sequential();
      model.add(tf.layers.dense({units: 1, inputShape: [1]}));

      // Prepare the model for training: Specify the loss and the optimizer.
      model.compile({loss: 'meanSquaredError', optimizer: 'sgd'});

      // Generate some synthetic data for training.
      const xs = tf.tensor2d([1, 2, 3, 4], [4, 1]);
      const ys = tf.tensor2d([1, 3, 5, 7], [4, 1]);

      // Train the model using the data.
      model.fit(xs, ys).then(() => {
        // Use the model to do inference on a data point the model hasn't seen before:
        // Open the browser devtools to see the output
        model.predict(tf.tensor2d([5], [1, 1])).print();
      });

TensorFlow.js + TensorFlow Hub

$ tensorflowjs_converter \
  --input_format=tf_hub \
  'https://tfhub.dev/google/imagenet/mobilenet_v1_100_224/classification/1' \
  /mobilenet/web_model

TensorFlow.js 用のモデルは Hub からも取得可能

TensorFlow.js

ローカルで作ったモデルもインポート出来る

$ tensorflowjs_converter --input_format keras \
                         path/to/my_model.h5 \
                         path/to/tfjs_target_dir
import tensorflowjs as tfjs

def train(...):
    model = keras.models.Sequential()   # for example
    ...
    model.compile(...)
    model.fit(...)
    tfjs.converters.save_keras_model(model, tfjs_target_dir)

ML Kit

  • Google ML Sdk

    • for iOS/Android

  • ベータ

  • Firebase 必須

  • モバイルフレンドリー

    • オンデバイスとクラウドAPI 利用の両方をサポート

    • オフラインでも精度が落ちるが使用はできる

ML Kit

Base API

すぐに使える API

機械学習に詳しくない人向け

  • Image labeling

  • Text recognition(OCR)

  • Face detection

  • Barcode scanning

  • Landmark detection

  • Smart reply (coming soon)

 

Custom Model

 

機械学習エキスパート向け

  • TensorFlow Lite モデル

    • Firebase にアップロード

    • アプリ側でモデルをダウンロード

  • ML Kit はこの API レイヤ

 

ML Kit

        FirebaseVisionImage image = FirebaseVisionImage.fromBitmap(mSelectedImage);
        FirebaseVisionTextDetector detector = FirebaseVision.getInstance().getVisionTextDetector();
        mButton.setEnabled(false);
        detector.detectInImage(image)
                .addOnSuccessListener(
                // ...
                )
                .addOnFailureListener(
                // ...
                );

ML Kit Text Recognition 利用例

ML Kit

←ローカル版

 

クラウド版

AIY

AI + DIY

  • 教育目的のデバイス

    • ダンボール+RasberryPi+他の部品

    • Voice Kit Vision Kit

  • Target に買いに行ったら売切れてた

その他

  • TPU v3
    • 撮影禁止だった…
  • 様々な MLの利用例 
    • 天文学、ロボティクス、音楽 etc
  • codelabs
    • 「TensorFlow and deep learning, without a PhD」

    • これから始める人にはおすすめ

感想

  • Google の機械学習に対する本気度が見える

    • キーノートの Google Duplex ・医療分野での AI 活用など

  • セッションetc からもTensorFlow や機械学習etc API をどんどん使わせようとしている印象

    • 将来的に Google 税を払って機械学習を利用するような世界になるのかも

Google I/O 2018

Web

Web 関連

  • PWA/AMP

  • セキュリティ関連

    • reCAPTURE v3

    • Web Authentication API

  • モダンな developertools

PWA/AMP

PWA

  • 日経新聞のサイトが紹介されていた

    • PWA を利用して高速化に成功

  • PWA Google Map

AMP

  • 厳密なルールに従うことで高速化

  • 新しく Web packaging

セキュリティ関連

reCAPTURE v3 public beta

  • 認証のチャレンジも必要なくなった

  • ユーザの行動からスコアリングしてロボットかどうか判断

Web Authentication API

  • fido aliance

  • 生体認証の規格

  • 将来的には指紋認証

    • 現在は2段階認証

 

developer tools

  • Workbox

  • Lighthouse

  • Polymer

  • lit-html

  • puppeteer

  • Chrome UX box

ご清聴ありがとうございました

Reference 1

資料を作るにあたって見なおした動画リスト

  • Keynote

  • Developer Keynote

  • What's New in Android

  • Modern Android development: Android Jetpack, Kotlin, and more

  • TensorFlow for JavaScript

  • Android Jetpack: what’s new in Android Support Library

  • TensorFlow in production: TF Extended, TF Hub, and TF Serving

  • Android Jetpack: manage UI navigation with Navigation Controller

  • What's new with sign up and sign in on the web

Reference 2

参考にしたページ

  • https://codelabs.developers.google.com/

  • https://developer.android.com/

  • https://www.tensorflow.org/get_started/

  • https://noti.st/jakewharton/ZvuDxC/present

google I/O 2018

By Shingo Suzuki

google I/O 2018

  • 1,354