そごうソフトウェア研究所

SOA、開発プロセス、ITアーキテクチャなどについて書いています。Twitterやってます@rsogo

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みたいなやつ。 f:id:begirama:20160519042558p:plain

家の中に置いておいて、声でGoogle Assistantに指示が出せます。

デモ中であったのは、「OK Google」って言って、音楽をかけたり(家中のスピーカーにも出力できる!)、宇宙について調べたり、スケジュールを変更したり。

リアルにどこまで使えるかやってみたい。 そのうち、Google Homeと連携するものを開発するためのツールが提供されるとのこと。

Google製メッセージアプリ「Allo」、ビデオチャットアプリ「Duo」

どちらもGoogleが出す、コミュニケーションアプリです。

  • Allo f:id:begirama:20160519043907p:plain 普通のメッセージアプリにない機能としては、ユーザーの振る舞いを学習して、相手の会話への回答の候補を出してくれます。それでよければ、タップして選ぶだけ。面白かったのが、相手が送ってきた犬の写真に対して、画像解析して、テキストへの返信と同じように「Cute dog!」などの回答候補がでること。

デモではチャットでレストランの予約をとっていました。 これも予約するためのプラットフォームに参加するお店がどのくらい日本で増えるかな。

個人的には、メッセージのフロントはLINEとか、FacebookメッセージやSlackなどなんでも良くって、後ろでGoogle Assistantが動いてて、会話のサジェスチョンもしてくれるし、レストランも予約してくれるってアーキテクチャがいいな。 きっとbotフレームワークもでるよね。

  • Duo f:id:begirama:20160519045543p:plain 娘さんのダンスが可愛いね。 電話をかけると、受ける方は取る前に相手の動画を見られる。誰かが家のインターフォンみたいなかんじだねって言ってた。確かに。

ハングアウトはどうなるんだろ。

Androidについて

Android Wear 2.0

これまでスマートフォンを母艦としないと何もできませんでしたが、スタンドアローンでいくつかの機能が動くようです。スタンドアローンで何ができて、何ができないのか、詳細はWearのセッションを楽しみにしたいと思います。

Android N

Android N自体は以前から発表されているので、知っている人は知っているという感じでした。 ここから誰でもNの名前を投票できるって。 Help name Android N

DaydreamっていうVRの仕組みでは、Android Nが前提となっているようです。

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にも触れていました。

Google I/O 2016 Live有りAndroidセッションまとめ

いよいよGoogle I/Oが今年も始まりますね。

events.google.com

ライブストリーミングがある予定の、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に上がってますね。

www.gitignore.ioを使って「OSX端末上でEclipseを使っているJavaのMavenプロジェクト」の.gitignoreファイルを作る

www.gitignore.ioを使って、OSX端末上で、Eclipseを使ってJavaMavenプロジェクトを開発している場合、 次のようなコマンドで.gitignoreファイルを作る。

curl https://www.gitignore.io/api/osx,java,eclipse,maven > .gitignore

今更使ったけど、すごい便利じゃないですか!

Concurrency Utilities for Java EE(JSR-236)のシンプルなサンプル試してみる

Java EEで非同期処理を行う方法を調べていました。 やりたいことは、iOSAndroidの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で公開しています。

github.com

参考ドキュメント

こちらを参考にさせてもらいました。

Concurrency Utilities for EE 7 | 寺田 佳央 - Yoshio Terada

Concurrency Utilities for Java EEをつかってみる - Qiita

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のマスコット(?)が表示されます。

f:id:begirama:20160407113229p:plain

ここまでがGetting Startedの内容ですが、Cordovaのマルチプラットフォーム感を味わうためにプラットフォームを追加してみましょう。

androidプラットフォームの追加

browserの時と同じようにandroidplatform 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

こんな感じ。

f:id:begirama:20160407113503p:plain

いけましたね。

Install Node.js v5 and NPM for Mac

Cordovaの環境構築のためにパッケージマネージャーのNPMを入れます。

インストーラーのダウンロード

こちらからpkgファイルをダウンロードします。Node.js 特にnode.jsでなんか作る予定はないので、最新のv5を使っていきます。

f:id:begirama:20160407094846p:plain

node.jsインストーラーの起動

f:id:begirama:20160407094954p:plain f:id:begirama:20160407095018p:plain f:id:begirama:20160407095052p:plain f:id:begirama:20160407095113p:plain f:id:begirama:20160407095035p:plain

node.jsの動作確認

動作確認してみましょう。まずはバージョンのチェック。

$ node -v
v5.10.1

さらにこちらの記事で作成されているサンプルを動かしてみます。

liginc.co.jp

紹介されていたサンプルコード

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ですね。

f:id:begirama:20160407100306p:plain

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でした。