やらなイカ?

たぶん、iOS/Androidアプリの開発・テスト関係。

日本Androidの会 VR部 #JAGVR 第1回勉強会に行ってきました

にわかに設立された日本Androidの会 VR部の第一回勉強会に行ってきました。

f:id:nowsprinting:20141116115552p:plain

ざっくりと二部構成で、発表と、班分けしてのVRデバイス体験&もくもく会

発表

ポイントだけ。細かくはそれぞれのスライド参照。

VR部について+AR・VRデバイスと開発環境の紹介(@youten_redo)

AR/VRコンテンツの作り方 - Google スライド

VR部の設立目的として、

  • みんなで(顔を合わせて)あそぶ
  • みんなで(はげましあってモチベを維持して)つくる

が挙げられていました。VRコンテンツとかUnityとか後発組の我々に取ってはありがたい限りです。

スライドの「VRコンテンツ要素の分類」には、Cardboard系のMHDや、ハコスコ(単眼ハコスコ)で体験できるVRコンテンツの違いが分類されていて、営業などでお客様に「まずここから」説明するときに使えそうな感じ。

質疑応答で用語の使い分けについて聞いたこと。

また、12/21(sun)に東海大学 高輪キャンパスで開催されるABC 2014 Winterに「VR部屋」が作られるので、デバイス・コンテンツの持ち寄り、また発表など企画しましょう、とのこと。

ABC 2014 Winter | Android Bazaar and Conference 2014 Winter

Google Cardboard を100円ショップの 材料で作ってみた(@ohwada)

20140820 Google Cardboard in Wearable Meeting

Cardboard本体をレーザーカッターで切り、レンズなどを100円ショップで調達する話。今はタオバイザー、ハコスコ版Cardboard、ハコスコDXとか完成品を購入できるものが出てきましたが、自作派も楽しそう。

自作といえば@kakocomさんが本体から自作なものを持って来られていて、見せていただきました。

VRにおける入力デバイス(@nowsprinting)

自分の発表。ざっと調べた、VR世界への入力方法(デバイスに限らず)の紹介。画像の選定にとても時間を食いました。

しかし、歯ブラシコントローラの素晴らしさを伝えきれていないような気がして、大変心残りです。どこかのVRイベントで見かけたらぜひ体験するべきです。

VRの薄い本について(@l1cml @syyama_net)

今朝見たらアカウントが変わっていた @syyama_net さん。VRの薄い本をRe:VIEWで書くので、執筆したい人募集!のこと。

透過型HMD Google Glass の紹介(@teshi04)

てしさんの人生初LT。最近影の薄い感じのあるGoogle Glassについて、できること、アプリストア、野良アプリなどの紹介。Glass愛を感じました。

普通にGlassをかけて街を歩ける世の中が来て欲しいというのは同感。常々「カメラ無くていいから」と思ってます。

VRデバイス体験&もくもく&雑談

3ブロックに分かれて、持ち寄ったデバイスの体験とか雑談とか。本当はジェスチャー入力系のAssetをアレコレしようと目論んでいましたが、持ち込んだマシンでは色々足りなくて断念。

気になっていたRICOH THETA m15とかステレオカメラ(3Dカメラ)とかの知見を得られたのでよかった。

また、懇親会では小さい方のテーブルでメインフレームの話とかVRの没入感についての話とかもして楽しかった。

まとめ

Androidか何かの下地があって、VRに入る取っ掛かりとしてはいい感じの勉強会だったと思います。 最近では「サマーレッスン」開発の話として「VRの一般化」ということが語られていて、そうなると開発者としても営業としても、人に説明/説得する、その手段として体験してもらう、ということは意識していかないと。

そして、次回開催より先にABC 2014 Winterが来ると思うので、何かしら協力したい。

ABC 2014 Winter | Android Bazaar and Conference 2014 Winter

Cardboardでもユニティちゃんを表示させてみた

Oculus Rift DK2で表示させたユニティちゃんを、できるだけそのままCardboardTaoVisor立体視してみます。

開発環境などは先のエントリを参照。

Durovis Dive Plugin

Durovis DiveというCardboardクローン的プロダクトがあり、そこでiOS/Android向けに簡単に立体視と視点のトラッキングを実現できるUnityプラグインが配布されています。

以下の手順で適用します。

  1. Dive SDKのページからプラグインをダウンロード(執筆時点のバージョンは2.0 r498)
  2. Assets -> Import Package -> Custom package...でインポート
  3. Project ViewのAssets/Dive/Dive_CameraをHierarchy Viewにドラッグアンドドロップ。従来のカメラを無効化(Inspectorでチェックをoff)
  4. Dive_CameraのTransformを適切に設定(Oculus Riftのときと同じ)
  5. スプラッシュスクリーンの表示が必須とのことなので、AssetsにあるDive-Splashscreen.unityをビルド対象に追加(File -> Build Settings...の"Scenes In Build"に追加)

f:id:nowsprinting:20141103153246p:plain

Oculus Riftに比べて視野角が狭いので、外周の歪みも無い(無くていい)みたい。

Androidデバイス向けにビルドする

Androidデバイス向けのビルドを行ないます。

なお、動作を試すだけなら、Unity Remote 4が使えるはずなのですが、Android版とUnity 4.5.5では同期できませんでした。

ビルドの設定

  1. File -> Build Settings... を開き、Platformの"Android"を選択します
    • ここで"Google Android Project"をonにすると、apkでなくAndroidプロジェクト(Ant版)が出力されます
  2. Build Settingsの[Player Settings...]ボタンをクリックするとInspectorの表示が切り替わり、ここでアイコンなどを設定できます
    • "Other Settings"に、"Bundle Identifier"、"Bundle Version"および"Bundle Version Code"の設定があります。"Bundle Identifier"の設定は必須です
    • "Publishing Settings"に、apkに、署名するためのキーストアの設定があります。デバッグ証明書を使う場合はキーストア未選択のままでいいようです
  3. Unity -> Preferences... -> External Tools の"Android SDK Location"を設定(選択)します
  4. これで[Build]もしくは[Build and Run]ボタンでビルドできます(出力ファイルパスを聞かれます)

コマンドラインでビルド

AndroidアプリはUnityコマンドで直接ビルドできないため、Unityプロジェクト内にビルドを実行するスタティックメソッドを作成し、それをコマンドラインから呼び出します。

ビルドメソッドの作成

まず、スクリプトの格納フォルダを作ります。Assets -> Create -> Folderでフォルダを生成。名前をEditorに変更します(namespace UnityEditorをエラーにしないために必須)。

続いて、Project ViewのEditorフォルダを右クリック -> Create -> C# Scriptでスクリプトを生成します。名前は任意ですが、クラス名と一致させる必要があるのでここではBuilder.csとしました。

using UnityEngine;
using UnityEditor;

public class Builder {

    static void BuildAndroid(){
        string[] scenes = {
            "Assets/Dive/Dive-Splashscreen.unity",
            "Assets/UnityChan/Scenes/UnityChan_hw.unity"};

        string msg = BuildPipeline.BuildPlayer(
            scenes,
            "Build/UnityChanVR.apk",
            BuildTarget.Android,
            BuildOptions.None);

        if(!string.IsNullOrEmpty(msg)){
            throw new System.Exception(msg);
        }
        Debug.Log("Build completed ");
    }
}

失敗時は例外をスローすることで、Unityコマンドが終了コード1で終了します。

コマンドライン指定

次のコマンドで、BuilderクラスのBuildAndroid()メソッドを実行できます。

$ /Applications/Unity/Unity.app/Contents/MacOS/Unity -quit -batchmode -logFile /dev/stdout \
    -executeMethod Builder.BuildAndroid

なお、

  • Unityは二重起動できないため、コマンド実行時Unityは落としておく必要があります(MonoEditorは起動していてok)
  • 出力ファイルは上書きしてくれますが、必要なディレクトリ(上例ではBuildディレクトリ)はあらかじめ掘っておきます
  • -logFile /dev/stdoutを指定することで、通常コンソールに出力されるログを標準出力に出力できます

iOSデバイス向けにビルドする

iOSデバイス向けのビルド(正確には、iOS向けのXcodeプロジェクトの出力)を行ないます。

なお、動作を試すだけなら、Unity Remote 4を使うと便利です。

OpenDiveSensor.csの修正

そのままiOS向けビルドを行なうと、Assets/Dive/OpenDiveSensor.csでAndroidJavaObjectが見つからないというエラーが出ます。このオブジェクト宣言自体が不要なので*1以下は削除します。

AndroidJavaObject mConfig;
AndroidJavaObject mWindowManager;

Oculusパッケージをプロジェクトから取り除く

OculusUnityIntegration.unitypackageをインポートしている場合、それがシーンで使用されていなくてもビルドエラー*2が出るようです。iOSデバイス向けでは使用しないので、Project ViewのAssets/OVRを削除します。

ビルドの設定

  1. File -> Build Settings... を開き、Platformの"iOS"を選択します
    • "Symlink Unity libraries"は、UnityのライブラリをXcodeプロジェクトにコピーしないため高速に動作します。XcodeプロジェクトだけCIサーバなどでビルドするのでなければonでいいはず
  2. Build Settingsの[Player Settings...]ボタンをクリックするとInspectorの表示が切り替わり、ここでアイコンなどを設定できます
    • "Other Settings"に、"Bundle Identifier"と"Bundle Version"の設定があります
    • "Bundle Identifier"は、Info.plistのCFBundleIdentifierにセットされますが、末尾は${PRODUCT_NAME}に置き換えられます
    • "Bundle Version"は、Info.plistのCFBundleShortVersionStringCFBundleVersionの両方にセットされます
  3. これで[Build]もしくは[Build and Run]ボタンでXcodeプロジェクトを出力できます(出力ファイルパスを聞かれます)

コマンドラインでビルド

iOSアプリ(Xcodeプロジェクト)もUnityコマンドで直接ビルドできないため、Unityプロジェクト内にビルドを実行するスタティックメソッドを作成し、それをコマンドラインから呼び出します。

ビルドメソッドの作成

Android向けに作成したBuilderクラスに、BuildIos()メソッドを追加します。

using UnityEngine;
using UnityEditor;

public class Builder {

    static void BuildAndroid(){
        (snip)
    }

    static void BuildIos(){
        string[] scenes = {
            "Assets/Dive/Dive-Splashscreen.unity",
            "Assets/UnityChan/Scenes/UnityChan_hw.unity"};

        string msg = BuildPipeline.BuildPlayer(
            scenes,
            "Build/UnityChanVRiOS",
            BuildTarget.iPhone,
            BuildOptions.SymlinkLibraries);

        if(!string.IsNullOrEmpty(msg)){
            throw new System.Exception(msg);
        }
        Debug.Log("Build completed ");
    }
}

コマンドライン指定

次のコマンドで実行します。

$ /Applications/Unity/Unity.app/Contents/MacOS/Unity -quit -batchmode -logFile /dev/stdout \
    -executeMethod Builder.BuildIos

Xcodeプロジェクトのビルド

生成されたプロジェクトは、Xcodeでビルドできます(Xcode 6.0.1で確認)。 Xcodeプロジェクトをコマンドラインでビルドするにはxcodebuildコマンドを利用できます。詳しくは『iOSアプリ テスト自動化入門』のChapter 6などを参照してください。

iOSアプリ テスト自動化入門

iOSアプリ テスト自動化入門

参考

Unity実践技術大全 (GAME DEVELOPER BOOKS)

Unity実践技術大全 (GAME DEVELOPER BOOKS)

ライセンス

ユニティちゃんライセンス

このコンテンツは、『ユニティちゃんライセンス』で提供されています

*1:Android向けに必要な物は"#if UNITY_ANDROID"の中に書かれているので

*2:Cross compilation job Assembly-CSharp.dll failed.

Oculus Riftでユニティちゃんを表示させてみた

にわかに日本Androidの会 VR部が設立されたり、OcuFes DCExpo2014@日本科学未来館でユニティちゃんに歯磨きしてあげたりと盛り上がってきたので、すっかり積みデバイス化していたOculus Rift DK2を開封して触ってみるなどしました。

開発環境

Oculus Rift DK2では75fpsを下回ると快適な体験を得られないとされています。MBPのGeForce GT 650Mではやや非力で、SDKに入っているデモアプリで60fpsくらい。でも開発には支障はないかな*1、というレベルです。

ユニティちゃんを表示する

このページを参考に。でも眺めるだけなので、操作はしない。

せっかくなのでハロウィン仕様で。

f:id:nowsprinting:20141103075837p:plain

Oculus Riftで表示する

このリポジトリのREADME.mdに書いてある手順を参考に、カメラをOVRCameraControllerもしくはOVRPlayerControllerに切り替えるだけ。前者はカメラだけなので位置も方向も固定。後者は頭を動かすとカメラも動きます。

ちなみに、.gitignoreもこのプロジェクトのものを流用しました。

f:id:nowsprinting:20141103075904p:plain

  • カメラは近め・低めくらいがちょうどいいかも。脚がちょうど視界に収まるカメラで、このスクリーンショットの感じ。
  • カメラの調整はHerarchy Viewでカメラを選択した状態でSceneエディタで動かして、GameObject -> Align With View でカメラのTransformを更新できる
  • 左右に表示されていたポーズ変更のウィンドウは、Herarchy Viewでユニティちゃんを選択 -> InspectorでIdle ChangeFace Updateのそれぞれ左のチェックを外すと消えます

プレイヤーをビルドする

プレイヤー(再生アプリケーション)をビルドします。

ビルドの設定

  1. File -> Build Settings... を開き、Scenes In Build右下の[Add Current]ボタンをクリックして、ビルド対象シーンを追加します
  2. Build Settingsの[Player Settings...]ボタンをクリックするとInspectorの表示が切り替わり、ここでアイコンなどを設定できます
  3. Oculus Rift向けの Player Settings -> Resolution and Presentation設定、および Edit -> Project Settings -> Quality設定*2が、OculusUnityIntegrationGuide.pdfに載っていますので適用します。
  4. これで[Build]もしくは[Build and Run]ボタンでビルドできます(出力ファイルパスを聞かれます)

ビルドの後続処理

Mac OS Xの場合、Assets/Editor/PostprocessBuildPlayer(拡張子なし)というスクリプトを置いておくと、ビルド処理の後でこれを実行してくれるそうです。 アーカイブやデプロイなど、またiOSアプリの場合はUnityが出力したXcodeプロジェクトをビルドする必要もあるので、これを利用できます。

ただ、ビルド自体をコマンドラインで(そしてCIで)実行するのであれば、これは利用せずにビルドツール側で書いたほうがいいでしょう。

コマンドラインでビルド

毎回GUI操作はめんどうなので、コマンドラインからビルドできます。

Mac OS X向けビルド

下記コマンドでビルドできます(.appファイルが生成される)

$ /Applications/Unity/Unity.app/Contents/MacOS/Unity -quit -batchmode -logFile /dev/stdout \
    -buildOSXPlayer ./Build/UnityChanVR.app

Windows向けビルド

Mac OS Xからでも下記コマンドでビルドできます。.exeファイルのほかに UnityChanVR_Data/というディレクトリができるので、両方デプロイすること。

$ /Applications/Unity/Unity.app/Contents/MacOS/Unity -quit -batchmode -logFile /dev/stdout \
    -buildWindowsPlayer ./Build/UnityChanVR.exe

なお、

  • Unityは二重起動できないため、コマンド実行時Unityは落としておく必要があります
  • 出力ファイルは上書きしてくれますが、必要なディレクトリ(上例ではBuildディレクトリ)はあらかじめ掘っておきます
  • -logFile /dev/stdoutを指定することで、通常コンソールに出力されるログを標準出力に出力できます
  • -buildXxxPlayerには他に、64bit, Universal, Linux, WebPlayerなどがあります。しかしiOS/Androidの指定は無く、-executeMethodでプロジェクト内のビルドスクリプトを実行する(スクリプトBuildPipeline.BuildPlayerでビルドする)形になります。

コマンドライン引数について詳しくは、本家のオンラインマニュアルを参照。

参考

Unity実践技術大全 (GAME DEVELOPER BOOKS)

Unity実践技術大全 (GAME DEVELOPER BOOKS)

モデリングなどの外部ツールiOS/Androidへのエクスポート、Asset Storeで入手できるオススメAssetなども紹介されています

Unityゲーム開発 オンライン3Dアクションゲームの作り方

Unityゲーム開発 オンライン3Dアクションゲームの作り方

エディタの使いかたなど、基本的な部分からページを割かれています

オンラインドキュメント

ライセンス

ユニティちゃんライセンス

このコンテンツは、『ユニティちゃんライセンス』で提供されています

*1:むしろ、この環境で快適なものを作るべき!

*2:SDK0.4以降、アンチエイリアスはoffにしてもキレイになったのでfpsを優先するためoffでいいそうです。see: 楽しく使う Oculus Rift DK2 「Unity編」シート

システムテスト自動化 標準ガイド が発売されます

テスト自動化研究会のメンバーで翻訳・執筆した、『システムテスト自動化 標準ガイド』が12月16日に発売されます。

システムテスト自動化 標準ガイド (CodeZine BOOKS)

システムテスト自動化 標準ガイド (CodeZine BOOKS)

原書は、10年前に書かれた書籍ながらいまだにテスト自動化界隈のアンケートなどで「参考になった」書籍に挙げられることの多い『Software Test Automation (ACM Press)』です。

原書は2部構成になっており、第1部には自動化に関する原理原則、第2部には事例が書かれていました。 本書では、第1部の翻訳に加え、第2部には近年の技術や事例を紹介する形で書きおろしという構成になっています。

第14章 CI(継続的インテグレーション

私も数ページながら、第2部・第14章『CI(継続的インテグレーション)』と題し、(原書で語られている)テストウェアの扱いや自動テストの前処理・後処理について、現在の技術・ツールの実現方法を中心に執筆させていただきました。

また、CIツールの例として、手軽に試すことのできるTravis CIの設定事例を紹介しています。

第14章の目次は以下の通りです。

蛇足

ちなみにこれまで、Amazonで「テスト自動化」で検索すると、拙著『iOSアプリ テスト自動化入門』がトップでヒットしていたのですが、本書によって一位の座を奪われました。く、くやしくなんて(ry

iOSアプリ テスト自動化入門

iOSアプリ テスト自動化入門

Travis CI Meetup Tokyo に行ってきました #travisci_jp

Travis CIのJosh Kalderimisさん、Hiro Asariさんが(RubyKaigiのため)来日されるということで、DeNAさんで開催されたMeetupイベントに行ってきました。

f:id:nowsprinting:20140327064058p:plain

当日撮影された動画および、発表スライドはconnpassの資料ページにまとめてあります

Travis CI Meetup Tokyo - 資料一覧 - connpass

travis-intro(Asariさん)

空のリポジトリから.travis.ymlを書きつつTravis CIの機能を説明していく形の、ライブCIとでも言うべきプレゼン。

使用したリポジトリGitHubで、またビルド履歴はTravis CIのビルドページで参照できます。

ランタイムや環境変数のマトリクスを書いたとき、

matrix:
    allow_failures:
        - rvm: x.x

などと書くと、指定した組み合わせのジョブがfailしてもビルド自体は成功扱いになるという機能、知りませんでした。

Travis CIについて(Joshさん)

Travis CI GmbHのCEO、Joshさんによる、中身の話。

  • Joshさんはニュージーランド住、ドイツ料理好き(Travis CIはドイツの会社)
  • 利用されている言語、travis.org(無料)はnode.jsが多い。travis.com(有料)はRubyが多い。
  • 主に、インフラとUIの2チーム
  • OpenVZ and Docker
  • BIWOMM (but it works on my machine!) からの脱却
  • マルチプラットフォームを提供するのは大変だけどやっている。case insensitiveなOSもあるし大変。
  • Xcode 6対応は近いうちに。
  • Job実行中、10分出力が無いと停止する制限は、'travis_wait'を使うことで回避できる。ただしビルド全体の制限である50分は回避できない。
  • forkされたリポジトリからpull-requestする上でのSecure Variablesの問題、対応を検討中。現状はひとつのリポジトリでブランチからのpull-requestで使って欲しい

LT

Travis API(pinzoloさん)

  • ビルドの履歴をAPIで取得して、Rubyバージョンごとのパフォーマンスを見える化
  • ただしdurationはapt-getの時間も含むので、ビルド単体の時間は取れない

Automated releasing iOS app with Travis CI(岸川さん)

  • iOSアプリのリリースビルドと、実機確認用のビルドを作ってTestFlightで配布する
  • まずリリースビルド(xcarchive)を作り、それを元にipaを作る
  • iTunes ConnectへのアップロードはAPIが無いため手作業だが、Travisで作ったファイルをS3にアップロードして保管し、それで申請している

QUnit on Travis CI(shigemk2さん)

  • 個人で開発しているJava ScriptライブラリをQUnitを使ってテスト

Tachikoma.io(sanematさん)

  • Travis CIは、リポジトリにpushされた契機でしかビルドされないため、依存関係にあるライブラリの更新によってビルドが壊れることを検知できない
  • そこで、定期的にpull-requestを作ってビルドを走らせるTachikoma.ioを作った

Testing your app with Selenium on Travis CI(yandoさん)

  • Travis CIにはFirefox(およびxvfb)が標準でインストールされている
  • やむを得ずheadlessでテストするのではなくGUIブラウザで、Seleniumなどを使った自動テストを実行できる

懇親会で聞いた話(差し支えないと思うので)

  • エンタープライズ用途、つまり、GitHub Enterpriseと組み合わせて使いたいという要望に対応する用意はあるそうで、サポートにメールで問い合わせて欲しいとのこと。
  • Xcode複数バージョンインストールは今後も考えていない。容量がかなり大きいこと、AppleNDAのこと。これは聞いてみたものの、バージョンが上がる過渡期にだけそう思うので、新しいものに更新される今の形で問題ないと思っています。

まとめ・所感

今回、Asariさんの呼びかけで企画され、募集とか司会とかでお手伝いさせていただきましたが、会場まわりは全てDeNAさんにやっていただき、司会のほうもJoshさん自ら質疑応答に入ったり、「あと一人で切ってもらおうか」と思ったら、"last one"と言ってくれるし、LTも皆さん概ね時間通りだし、少し余った分はyandoさんが埋めてくれるし、至れり尽くせりでした!

そしてなにより、Joshさんが楽しそうでよかった。ぜひまた来年もやりたいですね。

Travis CIのアップデートなどはTravis CIのブログでも告知されますが、Asariさんも入ってくれているTravis CI 日本語コミュニティでも色々情報が流れてきます。 Facebookのopen groupですので、どなたでも参加できます。

また、来週、京都と福岡でもMeetupが企画されています。お近くの方はぜひ!

MQTT Meetup Tokyo 2014.08 に行ってきました #mqttja

MQTTに関するアレコレを聞ける会 MQTT Meetup Tokyo 2014.08 (時雨堂さん主催、@niftyさん会場提供 )に行ってきたのでメモ

MQTTの概要(若山さん@ツキノワ)

MQTT(Message Queue Telemetry Transport)の特徴

  • TCPベース、オーバーヘッドが小さく、省電力なのでモバイルでも安心。M2MとかIoTとか。
  • publish/subscribe
  • メッセージごとにQoS(Quality of Service)を設定できる。QoS 0は保証なし、1は必達だが重複の可能性あり、2は正確に一回配信。
  • Will(遺言):クライアント接続時に、切断されたときに送るメッセージを設定できる。サーバ(ブローカー)がよきにはからってくれる
  • Retain:メッセージを配信するときにサーバでこれを保持して、後から接続されたサブスクライバにも配信してくれる
  • CleanSession:CleanSession=falseで接続したサブスクライバは、接続が切断されて再接続したとき、切断されていた間に送られたメッセージも受け取ることができる

現在、MQTT 3.1.1の仕様がOASIS標準の最終プレビュー中。 3.1から3.1.1では、パケット内のプロトコル名の変更、トピック名およびクライアントのIDがUTF-8固定になるなど。

より詳しくは、こちらにまとまっています。

MQTTについてのまとめ — そこはかとなく書くよん。

IBM MessageSight(鈴木さん@IBM

MQTT専用筐体であるIBM MessageSightの紹介。100万台つなげて、16message/secくらい送れている。 パレーマンスレポートも公開されている。

IBM ZP00: IBM MessageSight Appliance - Performance report - United States

MQTTでクラウドに上げたビッグデータのアナライズを部品化して提供するBluemixの紹介。

CoAP(林達也さん@lepidum)

MQTTの競合、CoAP(Constrained Application Protocol)について。

  • UDPベース、RFC7252
  • HTTP/RESTとの親和性(メソッドステータスコードマッピング
  • QoSとかはない
  • firefoxの拡張にcopperというものがある
  • 実用化にむけて追加仕様を検討しつつある。CoAP-MQとか
  • CBOR(しーぼる)
  • 課題は今は安全性、認証、認可、セキュリティ、プライバシー

MQTTブローカーを作った話(voluntasさん@時雨堂)

時雨堂MQTTブローカーを実装するにあたっての苦労など。

  • IBMさんのように専用筐体でなくクラウドで運用するもの
  • MQTT 3.1.1準拠、テストはパスしている
  • MQTT 3.1.1仕様では「メッセージが到達すること」などと書かれており、実装依存箇所が多い
  • クライアントの実装負担が軽い仕様である反面、サーバ側の負担は大きい。また接続数を考えると、リトライなどの負担を軽減することに腐心した。
  • MQTTの外、サービスとして必要な機能も実装。接続数、送信メッセージ数。またRetainの保持期限を設けるなど。

廣江さん@小松電機産業

センサー類→RaspberryPi+Arduino→MQTTをつなげてみた話。

  • アナログセンサー(水位とか)は一定間隔で送るので、QoS 0
  • デジタルセンサー(降雪とか)はON/OFFタイミングでしか送られないので、最低限QoS 1で、かつRetainにする
  • 移動体通信で従量課金であることを考えると、(MQTTといえども)メッセージは集約したい。アナログなら配列、デジタルはビット化するなど。またJSONでなくMessagePackを使うなど。
  • 実装言語は、軽量にするのであればC。その他、Golang、mruby
  • 時雨堂さんのMQTTブローカー(米東部?)を使ったデモ動画。若干の遅延はあるが、厳密なリアルタイム性を求められないなら十分実用的。シンガポールに移って遅延は減っている。

Sangoについて

時雨堂さんのMQTT as a Service。当日の00:00にローンチされた。

MQTT as a Service sango

現在はフリープランのみで、同時接続数3、QoS 0のみ。10月目標で有料プランを準備中。GitHubアカウントでサインアップして利用できる。

使いかたなどはこちら。

MQTT as a Service: Sango のリリースをお手伝いしました — そこはかとなく書くよん。

Android WearでIME (Minuum Keyboard) を使ってみた

Android向けの、小さいサイズのキーボードが売りのIMEであるMinuum KeyboardAndroid Wearに対応したと聞いて*1試してみました。

f:id:nowsprinting:20140717035208p:plain

ありがちな誤解の訂正

まず、ありがちな誤解*2について。以下を踏まえて、以降を読み進めてください。

IME on Android Wear

そもそもAndroid Wearからの入力は、音声入力もしくはGUIからのごく簡素な入力を前提とされています。 従って、プリインおよびGoogle Play Storeで公開されているAndroid Wear向けアプリには、EditTextで文字列を入力させるインタフェースを備えているものはありません。

Android Wear向けアプリでEditTextを使用することは可能ですが、Wearには(少なくとも、LG G Watchには)EditTextをタップしたときに起動するIMEがインストールされていないため、入力はできません*3

端末にインストールされているIMEは、以下のコマンドで確認できます。

$ adb shell ime list -a

これを通常のAndroid端末に向けて叩くと、IMEInputMethodServiceの実装)のID, name, packageNameなどが出力されます。

しかしAndroid Wear端末では、出力がありません(つまりIMEがひとつもインストールされていない)。

IMEのインストールと有効化

AndroidにおけるIMEは、ひとつのアプリとして端末にインストールすることができます。インストールまでは通常のアプリ(apk)と同じ手順で行ないます。

Minuum Keyboard(apkファイル入手方法は後述します)では、adb installコマンドで直接Wearデバイスにインストールします。

$ adb install -r PACKAGE.apk

インストールしたapkは、通常のAndroid端末であれば設定アプリの"言語とキーボード"で有効化を行えますが、Wearデバイスにはこの設定項目がありません。そのため、以下のコマンドで有効化を行ないます(Minuum on Android Wearの最新の手順にはime enableコマンドも書かれていますが、ime setコマンドだけで有効になります)。

$ adb shell ime set PACKAGE_NAME/.SERVICE_NAME

PACKAGE_NAMEにはapkのパッケージ名、SERVICE_NAMEにはInputMethodServiceのクラス名を指定します(Minuum Keyboardでは、インストール方法のメールに書かれています)。

これで、インストールしたIMEを使えるようになります。

Minuum Keyboardの利用

IMEを起動するにはEditTextを配置したActivityが必要です。Minuum Keyboardには、その設定アプリ内に動作確認を行なうことのできるEditTextが配置されているため、それを利用して確認します(独自のIMEをインストールした場合は、EditTextを備えたアプリも用意してください)。

1.ランチャーから"開始..."を選択し、"Minuum Settings"を探してアイコンをタップします

f:id:nowsprinting:20140717040646p:plain

2.起動には少し時間がかかります(一旦Watch Faceに戻りますがそのまま待ちます)。数秒後、MinuumのAgreement画面が表示されますので、内容をよく読んで"I agree"をタップします

f:id:nowsprinting:20140717040842p:plain

3.設定画面が表示されたら下にスクロールして、"Cheat sheet"をタップします

f:id:nowsprinting:20140717041058p:plain

4.チートシートEditText、そしてMinuum Keyboardが表示され、入力することができます。この画面を抜けるには、他のWearアプリ同様、右にスワイプします。

f:id:nowsprinting:20140717035208p:plain

Minuum Keyboardの入手

Android Wearで動作するMinuum Keyboardは、下記ページにサインアップ*4することで、メールでインストール手順とともにapkのダウンロードURLが届くはずです。

メールには、本エントリで具体的には書かなかったパッケージ名なども記載されています。基本的にメールに沿って実行していけば大丈夫なはずです。

Minuum Keyboardの使い勝手

そもそも、Android向けのIMEとしての実績があるアプリケーションで、小さいキーボードと、それに伴なうtypoを前提としてカバーする(予測変換的な)アルゴリズムが売りのようです。

ある程度typoしていても構わず入力していくと、正しい(入力したかった)単語が候補として表示されます。右スワイプで確定&スペース空け、左スワイプで一語削除と、一般的な英文であればスムーズに入力していくことができます。

ただ、記号の入力は辛いのと、老眼の人には細かすぎて厳しいような気がします。私はまだ全然大丈夫です。

現在、様々なデバイス向けのSDKを準備中のようで、下記サイトの下のほうに動画とサインアップフォームへのリンクが貼ってあります。

どのような販売形態・価格体系になるかわかりませんが、Android Wearのようにインストールに制約がある(コンシューマが簡単に使えない)デバイス向けには、SDKとしてアプリにバンドルさせる形を想定しているのではないでしょうか。

所感

Android Wearでも(設定すれば)IMEが使えるというのは面白いですね。 設定には開発者向けツールが必要なのと、インストールしたとしてもIMEを使えるアプリ(EditTextで入力させるアプリ)が無ければ使いどころもないので、すぐ実用化、一般化、となるものではないでしょう。しかし、ひとつのデバイスとして遊びどころはまだまだありそうです。

最後に。Android Wear 勉強会 #2の参加エントリも書かず、こんなの書いててごめんなさい…

*1:Android Wear対応の超小型ソフトウェアキーボード登場 | GGSOKU - ガジェット速報

*2:誤解というか出ている情報だけでは判断つきませんよねー

*3:Logcatを見る限り、特にエラーを吐くこともなく、なにもおこらない

*4:Mailing Listと書かれていますが、いわゆるMLではなく一方通行のアナウンスが送られてきます