Google I/O 2016。Keynote自分まとめ。Machine Learning、Google Home、Allo、Duo、Android N
Keynoteのライブ、見終わりました。
ここで録画が見られます。 www.youtube.com
Keynoteのメッセージの中心にはマシンラーニングがあったのかなと思います。 AlphaGoのようなマシンラーニングを活かすために、Google Assistantと、Assistantにテキストや、声でコミュニケーションするためのプロダクトが発表されました。
Google Home
Amazon Echoみたいなやつ。
家の中に置いておいて、声でGoogle Assistantに指示が出せます。
デモ中であったのは、「OK Google」って言って、音楽をかけたり(家中のスピーカーにも出力できる!)、宇宙について調べたり、スケジュールを変更したり。
リアルにどこまで使えるかやってみたい。 そのうち、Google Homeと連携するものを開発するためのツールが提供されるとのこと。
Google製メッセージアプリ「Allo」、ビデオチャットアプリ「Duo」
どちらもGoogleが出す、コミュニケーションアプリです。
- Allo 普通のメッセージアプリにない機能としては、ユーザーの振る舞いを学習して、相手の会話への回答の候補を出してくれます。それでよければ、タップして選ぶだけ。面白かったのが、相手が送ってきた犬の写真に対して、画像解析して、テキストへの返信と同じように「Cute dog!」などの回答候補がでること。
デモではチャットでレストランの予約をとっていました。 これも予約するためのプラットフォームに参加するお店がどのくらい日本で増えるかな。
個人的には、メッセージのフロントはLINEとか、FacebookメッセージやSlackなどなんでも良くって、後ろでGoogle Assistantが動いてて、会話のサジェスチョンもしてくれるし、レストランも予約してくれるってアーキテクチャがいいな。 きっとbotフレームワークもでるよね。
- Duo 娘さんのダンスが可愛いね。 電話をかけると、受ける方は取る前に相手の動画を見られる。誰かが家のインターフォンみたいなかんじだねって言ってた。確かに。
ハングアウトはどうなるんだろ。
Androidについて
Android Wear 2.0
これまでスマートフォンを母艦としないと何もできませんでしたが、スタンドアローンでいくつかの機能が動くようです。スタンドアローンで何ができて、何ができないのか、詳細はWearのセッションを楽しみにしたいと思います。
Android N
Android N自体は以前から発表されているので、知っている人は知っているという感じでした。 ここから誰でもNの名前を投票できるって。 Help name Android N
DaydreamっていうVRの仕組みでは、Android Nが前提となっているようです。
Daydream。Mobile VRの仕組み。スマートフォン、ヘッドセット&コントローラー、App。Android NにVR Modeがある。端末は結構スペック要りそうかな。#io16jp
— ryohei sogo (@rsogo) 2016年5月18日
Android Studio 2.2
既にプレビュー版がダウンロード可能になっています。 Layout Designerが新しくなるみたいです。XCodeなみにUIの開発が楽になれば・・・。
Android Instant App
インストールしないNativeアプリ。このあたり眠くて記憶がない。
Introducing Android Instant Apps | Android Developers Blog
Android Instant Apps | Android Developers
Firebase2.0
Androidとは直接関係ないけど、バックエンドサービスのFirebaseにも触れていました。
Firebase。Analytics、Cloud Messaging、Notification。この機能がFreeってこと?
— ryohei sogo (@rsogo) 2016年5月18日
#io16jp
@rsogo Firebase、Database、File Storageは有料みたい。Analytics、Cloud Messaging、Notificationだけ使えばいい場合には、無料だし良さそうだね。https://t.co/X0CF9cRuq9
— ryohei sogo (@rsogo) 2016年5月18日
#io16jp
Google I/O 2016 Live有りAndroidセッションまとめ
いよいよGoogle I/Oが今年も始まりますね。
ライブストリーミングがある予定の、Android関連セッションのうち、私が興味があるものをリストアップしてみました。 ちなみに私が興味があるのはAndroidの最新情報の概要と、AndroidアプリのUI、UX、アーキテクチャです。あと、Wearはどうなるのか?
May 18
キーノート
まずはキーノート。Androidについても何かしら発表があるでしょう。 goo.gl
What's new in Android" at #io16:
初日のキーノートの後は、Androidの最新情報のまとめから。キーノートと、What's newまでは生で見たい気がする。 goo.gl
Image compression for Android developers
What's newの後にいきなり、細かいトピックですが、画像の圧縮について。 goo.gl
Multi-Window mode
あんまり興味ないけど、一応、Android Nからサポートされるマルチウィンドウへの対応。 goo.gl
What the Fragment?
Fragmentについて。なんで今頃わざわざGoogle I/Oでやるんだろうか。 みんなどういう風に使うか、悩んでいるから? goo.gl
Android Auto: The Road Ahead
直近使うことはなさそうだけど、話題性としては、車の中で使用するためのプラットフォーム、Android Autoについて。 goo.gl
May 19
Android themes & styles demystified
テーマとスタイルについて。 goo.gl
What's new in Android development tools
Androidの開発ツールについて。最近2.xにバージョンアップしたAndroid Stuidioについてでしょうか。 goo.gl
What's new in Android Wear?
はっきり言って、Wearに関するセッションは少ないです。 今回のI/Oでも盛り上がりに欠けそうな予感はしていますが、新しい発表はあるでしょうか。 goo.gl
The experts' guide to Android development tools
Android Studioの深いところやTipsを教えてくれて、生産性があがるらしいです。 goo.gl
May 20
Android UI and layouts
UIとレイアウトについて。カスタムView、カスタムLayout、効率的なLayout階層構造などについて教えてくれるみたいです。 goo.gl
Android application architecture: Get ready for the next billion!
オフライン対応についてみたい。 goo.gl
A window into transitions
画面遷移のアニメーションなどについて。これ、iOSと比較して弱かったところなので、最新だとどうなっているのか興味がある。 goo.gl
Cordovaを6.xに、cordova-androidを5.xにバージョンアップしました
Cordovaをバージョンアップしました。
- バージョンアップ前
$ cordova -version 5.4.1
- バージョンアップ
$ sudo npm install -g cordova@6.1.1
- バージョンアップ後
$ cordova -version 6.1.1
Pluginのバージョン確認
$ cordova plugin version com.phonegap.plugins.PushPlugin 2.5.0 "PushPlugin" cordova-plugin-console 1.0.2 "Console" cordova-plugin-device 1.1.0 "Device" cordova-plugin-statusbar 2.0.0 "StatusBar" cordova-plugin-whitelist 1.2.0 "Whitelist"
合わせてcordova platformのバージョンアップ
以前からcordova-androidのバージョンが古いと警告がでていたので、platformのバージョンアップもやります。
cordova-android 5についての公式のリリース情報はこちら。手順も載ってる。 Cordova Android 5.0.0 - Apache Cordova
Using this version of Cordova with older version of cordova-android is being deprecated. Consider upgrading to cordova-android@5.0.0 or newer.
- バージョンアップ前
$ cordova platform Installed platforms: android 4.1.1 browser 4.0.0 Available platforms: amazon-fireos ~3.6.3 (deprecated) blackberry10 ~3.8.0 firefoxos ~3.6.3 ios ~4.1.0 osx ~4.0.1 webos ~3.7.0
- バージョンアップ
$ cordova platform update android Updating android project... Android project updated with cordova-android@5.1.1 Discovered plugin "PushPlugin" in config.xml. Installing to the project
- バージョンアップ後
$ cordova platform Installed platforms: android 5.1.1 browser 4.0.0 Available platforms: amazon-fireos ~3.6.3 (deprecated) blackberry10 ~3.8.0 firefoxos ~3.6.3 ios ~4.1.0 osx ~4.0.1 webos ~3.7.0
android 5.1.1に上がってますね。
Concurrency Utilities for Java EE(JSR-236)のシンプルなサンプル試してみる
Java EEで非同期処理を行う方法を調べていました。 やりたいことは、iOSやAndroidのPushメッセージのリクエストを受け付けて、リクエストの内容はデータベースに保存。非同期で、データベースの情報を元に、APNsやGCMにメッセージを送るという処理です。
選択肢としてはこんな感じかなと思います。
方式 | 検討したこと |
---|---|
Concurrency Utilities for Java EE | Concurrencyという名前が付いているだけあって、単なる非同期処理というよりは、並列処理に関するコントロールがいろいろできそうです。 |
Message Driven Bean | キューにメッセージがエンキューされたタイミングで、イベント・ドリブンで処理が動きます。JMSにメッセージがキューイングされるので、メッセージの永続化が可能。メッセージの永続化が可能なら、この方式かなと思います。今回は、Pushメッセージの内容はDBに永続化されていて、処理依頼のメッセージ自体のの永続性は不要だったので、JMSの環境構築の手間も考えて選択肢から外しました。 |
EJB Timer Service | 単純な非同期処理以外にも、cron的なスケジュールベースの処理起動ができるみたいです。今回の要件では、多重度なくて、並行処理はどっちでもいいので、こちらの方式でもいいかも。 |
このエントリではConcurrency Utilities for Java EEを使ってみたいと思います。 Executors.newSingleThreadExecutorを使ってみます。これは、アプリケーション・サーバーなどのコンテナからスレッドを借りてこれますが、スレッドの多重度は1つになります。 生成されたスレッドは、コンテナのコンテキストを持っています。
Executors.newSingleThreadExecutorを使ったサンプルコード
Webサービスでリクエストを受け付ける部分
GETメソッドで処理を受け付けて、後述する非同期処理を起動します。 リクエストごとにRequestIdを採番しています。
package sample; import javax.ws.rs.GET; import javax.ws.rs.Path; @Path("/task") public class TaskService { static int index = 0; @GET @Path("/") public void start() { System.out.println("TaskService.start is called. RequestId is " + index); TaskManager timer = TaskManager.getInstance(); timer.exec(index++); } }
非同期処理を行う部分
Executors.newSingleThreadExecutorを使って、処理を非同期で行います。 シングルトンで実装しています。
非同期処理部分で2秒間待合せ処理をしています。 パラメタで受け取ったリクエストIDと、スレッドを識別するためのスレッドIDをログに出力しています。
package sample; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class TaskManager { static private TaskManager instace = null; private ExecutorService executor = null; private TaskManager() { executor = Executors.newSingleThreadExecutor(); } synchronized static public TaskManager getInstance() { if (instace == null) { instace = new TaskManager(); } return instace; } public void exec(int requestId) { Runnable runnable = new Runnable() { public void run() { System.out.println("RequestId " + requestId + ":ThreadId " + Thread.currentThread().getId() + " is running."); try { Thread.sleep(2000); } catch (InterruptedException e) {} System.out.println("RequestId " + requestId + ":ThreadId " + Thread.currentThread().getId() + " is finished."); } }; executor.execute(runnable); } }
実行時ログ
作ったWebサービスを呼び出して、ログを確認します。 Executors.newSingleThreadExecutorを使っていることで、リクエストが重なった時も1つのスレッドで順次処理されていることがわかります。
# 最初のリクエスト 01:00:46,566 INFO [stdout] (default task-2) TaskService.start is called. RequestId is 0 01:00:46,568 INFO [stdout] (pool-5-thread-1) RequestId 0:ThreadId 138 is running. 01:00:48,570 INFO [stdout] (pool-5-thread-1) RequestId 0:ThreadId 138 is finished. # リクエストを受け付けて、処理が不通に動きました。スレッドIDは138。 01:00:50,164 INFO [stdout] (default task-3) TaskService.start is called. RequestId is 1 01:00:50,164 INFO [stdout] (pool-5-thread-1) RequestId 1:ThreadId 138 is running. 01:00:52,169 INFO [stdout] (pool-5-thread-1) RequestId 1:ThreadId 138 is finished. # ここからリクエストを連続で投げました 01:00:53,444 INFO [stdout] (default task-4) TaskService.start is called. RequestId is 2 01:00:53,444 INFO [stdout] (pool-5-thread-1) RequestId 2:ThreadId 138 is running. 01:00:53,756 INFO [stdout] (default task-5) TaskService.start is called. RequestId is 3 01:00:54,028 INFO [stdout] (default task-6) TaskService.start is called. RequestId is 4 01:00:54,317 INFO [stdout] (default task-7) TaskService.start is called. RequestId is 5 # リクエストは受付られましたが、処理はキューイングされています 01:00:55,447 INFO [stdout] (pool-5-thread-1) RequestId 2:ThreadId 138 is finished. 01:00:55,447 INFO [stdout] (pool-5-thread-1) RequestId 3:ThreadId 138 is running. 01:00:57,448 INFO [stdout] (pool-5-thread-1) RequestId 3:ThreadId 138 is finished. 01:00:57,449 INFO [stdout] (pool-5-thread-1) RequestId 4:ThreadId 138 is running. 01:00:59,451 INFO [stdout] (pool-5-thread-1) RequestId 4:ThreadId 138 is finished. 01:00:59,451 INFO [stdout] (pool-5-thread-1) RequestId 5:ThreadId 138 is running. 01:01:01,452 INFO [stdout] (pool-5-thread-1) RequestId 5:ThreadId 138 is finished. # 同じスレッドIDで順次、処理が実行されていきました
サンプルコード
サンプルコードの全部はGithubで公開しています。
参考ドキュメント
こちらを参考にさせてもらいました。
Cordovaのサンプルをブラウザと、Androidで実行するまで
このエントリーでは、こちらのCorova公式サイトのGetting Startedで紹介されている手順をやってみます。 cordova.apache.org
Cordovaの環境の準備はこちらのエントリで書いています。 begirama.hatenablog.com
それでは行きましょう。
プロジェクトの作成
cordova create
コマンドで、プロジェクトの新規作成が行えます。
$ cordova -v 5.4.1 $ cordova create MyApp Creating a new cordova project.
以下の操作はすべて新しく作られたMyAppディレクトの中で作業を行います。
browserプラットフォームの追加
cordova platform add
コマンドで、プラットフォームを追加します。
ここではGetting Startedの手順通り、browserを追加しています。
$ cordova platform add browser Adding browser project... Running command: /Users/rsogo/.cordova/lib/npm_cache/cordova-browser/4.0.0/package/bin/create /Users/rsogo/work/cordova_sample/MyApp/platforms/browser io.cordova.hellocordova HelloCordova Creating Browser project. Path: platforms/browser Discovered plugin "cordova-plugin-whitelist" in config.xml. Installing to the project Fetching plugin "cordova-plugin-whitelist@1" via npm Installing "cordova-plugin-whitelist" for browser
実行
cordova run
コマンドで、先ほど追加したbrowserプラットフォームを実行します。
ここで、追加していないプラットフォームを指定すると、怒られます。
cordova run browser Running command: /Users/rsogo/work/cordova_sample/MyApp/platforms/browser/cordova/run Static file server running on port 8000 (i.e. http://localhost:8000) CTRL + C to shut down Static file server running @ http://localhost:8000/index.html CTRL + C to shut down
runすると、ブラウザが立ち上がって、Cordovaのマスコット(?)が表示されます。
ここまでがGetting Startedの内容ですが、Cordovaのマルチプラットフォーム感を味わうためにプラットフォームを追加してみましょう。
androidプラットフォームの追加
browserの時と同じようにandroidもplatform add
コマンドで既存のプロジェクトに追加します。
$ cordova platform add android Adding android project... Running command: /Users/rsogo/.cordova/lib/npm_cache/cordova-android/4.1.1/package/bin/create /Users/rsogo/work/cordova_sample/MyApp/platforms/android io.cordova.hellocordova HelloCordova --cli Creating Cordova project for the Android platform: Path: platforms/android Package: io.cordova.hellocordova Name: HelloCordova Activity: MainActivity Android target: android-22 Copying template files... Android project created with cordova-android@4.1.1 Installing "cordova-plugin-whitelist" for android This plugin is only applicable for versions of cordova-android greater than 4.0. If you have a previous platform version, you do *not* need this plugin since the whitelist will be built in.
どんなものが生成されたのか見てみましょう。 MyAppの直下にplatformsというディレクトリがありますね。
$ ls config.xml hooks platforms plugins www platforms/ plugins/
更にplatformsの下には先程追加したbrowserとandroidのディレクトリがあります。
$ ls platforms/ android/ browser/ platforms.json
さらにandroidの中に入って行くと、Androidのよく見るプロジェクト構成になっています。
$ ls platforms/android/ AndroidManifest.xml assets libs res CordovaLib build.gradle platform_www settings.gradle android.json cordova project.properties src
実行
こちらも同じくcordova run
コマンドのオプションにプラットフォーム名を指定して、実行できます。
$ cordova run android Running command: /Users/rsogo/work/cordova_sample/MyApp/platforms/android/cordova/run ANDROID_HOME=/Applications/adt-bundle-mac-x86_64-20140702/sdk JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home WARNING : No target specified, deploying to device 'CB5A26M91X'. Running: /Users/rsogo/work/cordova_sample/MyApp/platforms/android/gradlew cdvBuildDebug -b /Users/rsogo/work/cordova_sample/MyApp/platforms/android/build.gradle -PcdvBuildArch=arm -Dorg.gradle.daemon=true Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
こんな感じ。
いけましたね。
Install Node.js v5 and NPM for Mac
Cordovaの環境構築のためにパッケージマネージャーのNPMを入れます。
インストーラーのダウンロード
こちらからpkgファイルをダウンロードします。Node.js 特にnode.jsでなんか作る予定はないので、最新のv5を使っていきます。
node.jsインストーラーの起動
node.jsの動作確認
動作確認してみましょう。まずはバージョンのチェック。
$ node -v v5.10.1
さらにこちらの記事で作成されているサンプルを動かしてみます。
紹介されていたサンプルコード
var http = require('http'); http.createServer(function (request, response) { response.writeHead(200, {'Content-Type': 'text/plain'}); response.end('Hello World\n'); }).listen(8124); console.log('Server running at http://127.0.0.1:8124/');
http://localhost:8124/
にアクセスしてみます。OKですね。
npmの動作確認
続いて、一緒にインストールされてnpmの確認。 バージョンチェック。
$ npm -v 3.8.3
cordovaをインストールしてみます。
$ sudo npm install -g cordova fetchMetadata → network ▄ ╢██████████████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░╟
以上で、cordovaのインストールが完了しました。
sudoしないと、権限エラーで怒られました。
npm ERR! Error: EACCES: permission denied, access '/usr/local/lib/node_modules' npm ERR! at Error (native) npm ERR! { [Error: EACCES: permission denied, access '/usr/local/lib/node_modules'] npm ERR! errno: -13, npm ERR! code: 'EACCES', npm ERR! syscall: 'access', npm ERR! path: '/usr/local/lib/node_modules' } npm ERR! npm ERR! Please try running this command again as root/Administrator.
npmで古いバージョンのインストール
今日時点で、最新のCordovaのバージョンは6.1.1でした。既存の資産がバージョン5でないと動かない箇所があるみたいなので、古いバージョンを指定してインストールします。
$ cordova -v 6.1.1 $ sudo npm install -g cordova@5.4.1 (略) $ cordova -v 5.4.1
OKでした。