Oculus Go を文章書き&開発マシンにする

Oculus Go にも Bluetooth Keyboard が接続できて、さらに一般の Android アプリが動くらしいと今更ながら知ったので、先人の知恵をお借りしつつ UserLAnd を動かしてみました。どこでも Oculus Go をかぶって大画面で日本語文章書いたりプログラム書いたりできます。
Remote Desktop ではないので Network がなくても単体で使えます。

Oculus Go UserLAnd Oculus Go UserLAnd
↑ Oculus Go で動く Debian の Desktop。Oculus TV は残念ながら画面キャプチャできないので、Oculus Go を覗いたところを無理やり写真に撮っています。

参考にさせていただいた情報
Oculus Go Tips
KILINBOX: Oculus GoでAndroidアプリを動かす

調べてみたらすでに同じようなことを実践している方もいらっしゃるようです。
Oculus GoでスタンドアロンVR作業環境を作った

● Bluetooth Keyboard が使える

adb 経由で Settings 画面を呼び出せば Bluetooth 設定ができるようです。上の参考にさせていただいた Tips ページで直接 Bluetooth 画面を呼び出す方法が紹介されています。

下記のように設定画面の Top を呼び出すことも可能です。(追記 2019/02/06: この方法ではダイアログが操作できない場合があることがわかったので非推奨です。詳細はこちら)

adb shell am start -a android.intent.action.MAIN -n com.android.settings/.Settings

毎回 PC 上で呼び出すのも大変なので、単独で使えるよう設定画面を呼び出すアプリを作成しました。(後述)

● 一般のアプリが動く

通常の Android apk を Oculus Go にそのまま install しても VR に対応していないためライブラリに表示されません。ところが公式アプリの Oculus TV を起動すると、一部のアプリが下の方に表示されていました。選択すると VR 空間の TV の中で実行できるようです。

特に Termux は何もしなくても表示されており、apk install だけでそのまま使うことができました。↓

Oculus Go Termux

どうやら Oculus TV には Android TV に対応したアプリが表示されるようです。AndroidManifest.xml に LEANBACK_LAUNCER を登録しておけば Oculus Go の上で実行できることになります。

Linux 環境を走らせるアプリ UserLAnd には LEANBACK_LAUNCER が入っていないので Oculus TV から見えませんでした。ダミーアプリを作って Intent で呼び出せば Oculus TV の上で実行できそうです。

こちらで紹介されていた TvAppRepo というアプリがまさにそれで、Android TV 用のダミーアプリを実機上で作ることができます。

● UserLAnd を呼び出すだけのアプリを作る

実際にアプリを作ってみます。AndroidStudio で Android TV 向けの空 Project を作ります。Tempalte で Android TV Activity を選択しておき、Activity 起動直後に UserLAnd を呼び出します。

// MainActivity.java
import  android.app.Activity;
import  android.content.ActivityNotFoundException;
import  android.os.Bundle;
import  android.content.pm.PackageManager;
import  android.content.Intent;

public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        PackageManager manager= getPackageManager();
        Intent it= manager.getLaunchIntentForPackage( "tech.ula" );
        it.addCategory( Intent.CATEGORY_LAUNCHER );
        startActivity( it );
    }
}

これだけでうまくいきました。apk 作ってを Oculus Go に install すると Oculus TV にアイコンが並びます。起動すると Oculus TV の上で UserLAnd が動きました。

Bluetooth Keyboard があれば任意の Linux Distribution を使うことができます。これでテキストエディタ、日本語入力、開発用言語など、様々なものが動きます。

この UserLAnd を呼び出すだけの簡単なアプリをこちらで公開してみました。ついでに Real VNC Viewer と設定画面も呼び出せるようにしています。

GitHub: TVWrapperUL 1.0

● VNC を起動する

LuserLAnd が内部で呼び出している bVNC Free は残念ながら Oculus Go で動きませんでした。VR を無視して全画面表示になってしまいます。代わりに Real VNC Viewer (com.realvnc.viewer.android) が動いたのでこちらを使います。UserLAnd と全く同じように Wrapper アプリで呼び出せるので TVWrapperUL に追加しました。

UserLAnd で動いている tightvncserver の port は 5951 です。VNC Server のアドレスには “127.0.0.1:5951” を指定してください。

● 手順の詳細

(1) Oculus Go を Develoepr mode にして PC と adb で接続します。

(2) TVWrapperUL の apk を Oculus Go に install してください。

adb install TVWrapperUL1.0.apk

(3) Oculus TV から TVWrapperUL を起動。Settings → Bluetooh で Bluetooth Keyboard をペアリングしておきます。

(4) UserLAnd (tech.ula) と RealVNC Viewer (com.realvnc.viewer.android) の APK を adb で Oculus Go に install します

(5) Oculus TV → TVWrapperUL → UserLAnd で起動します。

(6) 任意の Linux Distributon を選択します

 Keyboard を使って Username, password, VNC password を入力。ここでは SSH を選びます

日本語化を行えば、そのまま Console で文章書き環境として利用可能です。

UserLAnd の日本語化や日本語入力環境の解説

↓Ubuntu の Console で日本語入力
null

Desktop (lxde 等) 環境も VNC 経由で使うことができます。

● VNC 接続手順

(1) Oculus TV → TVWrapperUL → UserLAnd

(2) Linux Distributon を選択。User を作って VNC を選択

  すでに SSH で作ってある場合は下記の手順で VNC 切り替えます。

  1. 長押しして Stop App
  2. もう一度長押しして App Info → VNC に切り替え
  3. Distribution 名をクリックすると起動

(3) Client アプリがないと言われるので一旦 OK して、Controller のメニュー(←) ボタンを何度か押して戻る

(4) Oculus TV → TVWrapperUL → RealVNC を選択

(5) 右下の + ボタンを押して New Connection 画面から設定を追加。Address は “127.0.0.1:5951” 名前は任意

(6) (5) で作った設定を選んで CONNECT を押す。User 作成時に決めた VNC Password を入れると繋がります。

Desktop の install 手順、VNC 解像度指定方法などはこちらを参照してください。

● 課題など

Android 設定画面から物理キーボードのレイアウト変更ができませんでした。設定画面が落ちるため。(追記: X11 desktop なら xmodmap による変更は可能) (追記 2019/02/06: Oculus TV + TVLauncherGo から設定を呼び出せばできることがわかりました)

Oculus Go Controller を使ったマウス操作が難しいかもしれません。

Oculus TV 上で起動したアプリは画面キャプチャが禁止されているらしく、画面を保存できなくなっています。ミラーリングも真っ黒な画面です。

(追記 2019/02/06: UserLAnd 以外も呼び出せるランチャーを作りました。詳細はこちら「Oculus Go で一般 Android アプリを起動できるランチャーを作ってみた」)

関連ページ
Android の上の開発環境: UserLAnd

関連エントリ
UserLAnd とブラウザ
Android 上の開発環境と UserLAnd
OS の中の Linux (WSL/Chrome OS/Android UserLAnd)
ARM CPU 上の開発環境とコンパイル時間の比較 (2) Pixel 3/UserLAnd
Gear VR のヘッドセットの種類のまとめ
Oculus Go は VR ができる新しい携帯ゲーム機

UserLAnd とブラウザ

Firefox だけでなく Chromium-browser も使えるらしいので使ってみました。ただし –no-sandbox オプションが必要です。(参考にしたページ)

UserLAnd Ubuntu で動く Chromium (Essential Phone PH-1)
null

● Install と起動方法

Debian の場合

$ sudo apt install chromium
$ chromium --no-sandbox

Ubuntu の場合

$ sudo apt install chromium-browser
$ chromium-browser --no-sandbox

2018/01/31 現在、Ubuntu では Firefox が正しく動いておらず起動しても黒い画面のまま固まってしまいます。Chromium が代わりに使えそうです。

Debian では Firefox も問題なく動いています。

● 画面分割

Android 7 以降なら画面分割が可能なので Android のブラウザを併用する方法もあります。

画面分割で Ubuntu と Android の Chrome と併用↓
null

UserLAnd の desktop は VNC でも XServer XSDL (X11) でも Software Rendering なので、速度と安定度を重視するなら画面分割もお勧めです。

Android 9 Pie だと XServer XSDL が restart を繰り返してしまい起動できないようです。Essential Phone と Pixel 3 の両方で確認。VNC は動きます。

関連エントリ
Android 上の開発環境と UserLAnd
OS の中の Linux (WSL/Chrome OS/Android UserLAnd)
ARM CPU 上の開発環境とコンパイル時間の比較 (2) Pixel 3/UserLAnd

Termux で持ち運べるモバイルリポジトリを作る Mercurial/Git

Linux だと同期できるオンラインストレージの選択肢があまりありません。ARM だとなおさらで、ARM 向けの公式クライアントが用意されていなかったりします。今まで設定ファイルの共有に Dropbox を使い Mercurial で履歴管理をしていたのですが、arm 機種の Termux/UserLand では代わりの手段が必要になりました。

最近のスマートフォンは内部ストレージも増えているので、手持ちの Android スマートフォンを持ち運べるリポジトリにしてみます。

UserLAnd なら GitBucket もそのまま動きます。簡単に高機能なリポジトリサーバーを実現できますが UserLAnd はファイルアクセスがあまり速くありません。固定のリポジトリなら ssh で十分なので、今回は Termux を使用しました。

termux の ssh については こちら(Termux wiki) を参考にしました。

以降のコマンド表記でプロンプト ‘$’ はすべてスマートフォンの Termux 上の操作になります。プロンプト ‘>’ は PC (Windows/macOS/Linux) 等、他のデバイスからの操作を意味しています。

● Termux に SSH で接続する

$ pkg upgrade
$ pkg install openssh

termux はデフォルトで ssh の Password 認証が有効になっています。

まず termux に password を設定します。

$ passwd

sshd を起動します。

$ sshd

これで ssh で接続できるようになります。ポート番号は 8022 です。

最近の Windows 10 には最初から OpenSSH が含まれているので、PC のコマンドラインから下記のように実行するだけで接続することができます。

> ssh <AndroidIPAddress> -p 8022

もちろん Putty 等の client も使えます。Putty の場合 user name はダミーで何でも OK です。

● Termux に git / mercurial を install する

termux 上で git を install しておきます。

$ pkg install git

Mercurial の場合 termux に pakcage が用意されていませんが、pip を使って install することができます。

$ pkg install python2 python2-dev clang
$ pip2 install mercurial

● Termux 上に repository を作る

リポジトリを termux 上で作るか、または既存のリポジトリを Termux にコピーします。

新規に作る場合任意のフォルダで init。

$ mkdir ~/repository_git
$ cd ~/repository_git
$ git init

$ mkdir ~/repository_hg
$ cd ~/repository_hg
$ hg init

既存のリポジトリをコピーする場合は scp (WinSCP 等) を使うことができます。Git の場合は .git フォルダ、Mercurial の場合は .hg フォルダを Termux にコピーするだけです。他にサーバーがあるなら Termux 上で clone しても構いません。

> scp -r -P 8022 .hg <AndroidIPAddress>:repository_hg/

あとは普通にスマートフォン上のリポジトリにアクセスできます。下記は PC 等他の Device からの操作になります。

> git clone ssh://<AndroidIPAddress>:8022/~/repository_git

> hg clone ssh://<AndroidIPAddress>:8022/repository_hg

git の場合は絶対パスなので HOME 相対には ~ が必要です。mercurial は常に HOME からのパスになるようです。反応が鈍い場合はスマートフォンのロック(スリープ)を解除してみてください。

● Termux に public key 認証でログインする

git / hg の同期時に毎回パスワードを入力するのは手間なので、public key 認証を使ってみます。Windows 10 も Linux 等、他の OS と手順は同じです。

> ssh-keygen

id_rsa.pub をスマートフォンに転送します。このファイルは Windows の場合 C:\Users\<ユーザー名>\.ssh 以下にあります。転送は scp でも良いですし、もっと簡単に USB 接続して直接ファイルコピーしても構いません。

termux 上で共有 storage にアクセスできるようにしておきます。

$ termux-setup-storage

例えば Android の Download フォルダに転送した場合 ~/storage/downloads/id_rsa.pub でアクセスできるようになります。

id_rsa.pub の内容を Termux の authorized_keys に追加します。

$ cd ~/.ssh
$ cat ~/storage/downloads/id_rsa.pub >> authorized_keys
$ chmod 600 authorized_keys

これで git/hg の同期の度に password を毎回打たなくて済むようになりました。

● 使用してみて

バックアップには向かないのであくまで外出時の同期用にしています。設定ファイルだけでなく、個人で使うプロジェクトには十分使えそうです。

関連エントリ
Android 上の開発環境と UserLAnd
OS の中の Linux (WSL/Chrome OS/Android UserLAnd)
ARM CPU 上の開発環境とコンパイル時間の比較 (2) Pixel 3/UserLAnd
Android/Linux MaruOS その4
Nexus 7 上に開発環境をつくる (4) Ubuntu 13.04

Android 上の開発環境と UserLAnd

Android 上の開発環境のまとめページを作成しました。

Android の上の開発環境

UserLAnd は root 不要で、アプリとして Linux 環境をそのまま Android 上で走らせることができます。Store から install するだけで済み、Windows 10 の WSL のように手軽に扱えます。

Google Play: UserLAnd

ただの 1アプリとしてユーザーモードで走りますが、proot を使うことでほぼ完全な Linux 環境を作り出しているようです。例えば proot の下でファイルを作成すると、隠しファイル .proot-meta-files.* が作られます。この meta-file の中には独自の file mode (644等) と UID/GID が記録されており、user 管理やファイルパーミッションが再現されています。同じように Hard Link を用いると .proot.l2s.* といった管理ファイルが作られています。これは Symbolic Link で代用するための仕組みです。

反面、meta-file があるためファイルアクセスには追加のコストが発生しているようです。以前行ったコンパイル時間のテストを見ても、termux と比べるとビルド速度が落ちていることがわかります。それでも Android 上でほぼ完全な Linux 環境がそのまま動くのは非常に魅力的です。

ARM CPU 上の開発環境とコンパイル時間の比較 (2) Pixel 3/UserLAnd

現在 Arch, Debian, Kali, Ubuntu の 4つの Linux Distribution を選択可能で、それぞれ別のストレージ領域が割り当てられます。SSH を使った Console または VNC を使った Desktop を選ぶことができます。SSH or VNC はいつでも切り替え可能です。

以前は外部アプリとして SSH client が必要でしたが、UserLAnd の新しい Version では SSH Terminal が統合されました。Connect Bot の install が不要になっています。

ZenFone AR の UserLAnd (Debian)
null

以下いくつか設定などのメモ

● Install

UserLAnd アプリを Install したあと、任意の Distribution を選択するだけです。最初に外部ストレージへのアクセス許可と、ログインに使う user name や password の設定が必要です。

● SSH / VNC 切り替え

UserLAnd アプリの Distribution 名を長押しで App Info から設定できます。切り替え時は一旦 UserLAnd の再起動が必要です。Distribution 名を長押しして Stop App で止めてから、さらに UserLAnd アプリを終了して再び起動します。

● Desktop の install 方法

最初に SSH, VNC どちらを選んでも構いません。

sudo apt install lxde

その後 VNC に切り替えます。(一旦止めるのを忘れないように)

● VNC の解像度設定

Debian の場合は ~/.vncrc 、Ubuntu の場合は ~/.vnc/tightvncserver.conf に下記の内容を書き込む。

$geometry = "1280x720"

Smartphone の Native 解像度 (2160×1080, 2560×1440 等) をそのまま指定すると文字が小さすぎるので注意。720p 前後がおすすめです。

・ZenFoenAR (2560x1440)            : $geometry = "1280x720"
・Pixel 3 (2160x1080)              : $geometry = "1440x720"
・Essential Phone PH-1 (2560x1312) : $geometry = "1330x720"

● Keyboard / Mouse

Desktop を使う場合は Buletooth Keyboard / Mouse の併用をお勧めします。Gboard や Google 日本語入力なら物理キーボードのレイアウトを選択できます。Ctrl/Caps/ESC 等の配列変更には106/109ハードウェアキーボード配列変更(+親指Ctrl)がお勧めです。

Google Play: 106/109ハードウェアキーボード配列変更(+親指Ctrl)

● SSH 経由のアクセス

PC 等から SSH 経由でアクセスきます。port は 2022。

$ ssh <AndroidIPADDR> -p 2022

SSH (console) モードでは何もせずそのまま接続できます。VNC mode では下記のように予めサーバーを起動しておく必要があります。

$ sudo /support/startSSHServer.sh

● Android 外部 Storage へのアクセス

/sdcard でアクセスできます。例えば Android でダウンロードしたファイル一覧を見るには下記のようになります。

$ ls /sdcard/Download/

● ブラウザ

2019/01 現在 Ubuntu では Firefox の画面が真っ黒で見えなくなっています。Debian では動いています。Android 7 以降なら画面分割できるので、Android のブラウザを併用する方法もあります。

● 自分自身への adb 接続

Android を Developer mode にしたあと一旦 PC に USB 接続して adb で tcpip に切り替えておきます。

PC 上で “adb tcpip 5555” を実行。

これで Android (UserLAnd) 上では adb で自分自身が “emulator-5554” として見えるようになります。

$ sudo apt install android-tools-adb
$ adb devices

● 日本語入力

SSH 等の Console では uim-fep, uim-mozc が使えます。下記手順は Ubuntu の場合。

$ sudo apt isntall language-pack-ja
$ sudo update-locale LANG=ja_JP.UTF-8
$ sudo dpkg-reconfigure tzdata
$ sudo apt install uim-fep uim-mozc

ファイル ~/.uim を作成 (任意)

(define default-im-name 'mozc)
(define-key generic-on-key? '(" " "g"))
(define-key generic-off-key? '(" " "g"))

起動方法

$ export LANG=ja_JP.UTF-8
$ uim-fep

上の設定例では Ctrl + SPACE または Ctrl+G で入力モードを切り替えています。なお Android 9 Pie では Android 側で Ctrl + SPACE が使われており Console への入力ができないようです。使えない場合は代わりに Ctrl + @ を試してみてください。Android 7 では Ctrl + SPACE が使えました。

Desktop の場合。下記手順は Debian の場合。

$ sudo apt install lxde
$ sudo apt install task-japanese
$ sudo apt install task-japanese-desktop
$ sudo apt isntall fonts-takao
$ sudo dpkg-reconfigure tzdata
$ sudo dpkg-reconfigure locales

一旦 UserLAnd 再起動。

Debian streatch には mozc の arm64 が無いのでそのままではインストールできません。下記ページを参考にさせていただきました。
 ・matoken’s meme: Debian, Ubuntu で 上流のパッケージを借りてくる

上のページを参考に buster を追加してから

$ apt install uim-mozc

入力切り替えキーの設定は Desktop Menu から「設定→入力メソッド→全体キー設定」。Terminal は LXTerminal を使用。

日本語設定の参考にしたページ
 ・WSLのUbuntu環境を日本語化する
 ・uim-fepとuim-anthyの使い方と設定方法
 ・WSLのDebian環境を日本語化する
 ・Debian, Ubuntu で 上流のパッケージを借りてくる

● 他の Distribution ファイルへのアクセス

ストレージ領域は /data/data/tech.ula/files/ 以下にあります。Filesystem を作るごとに /data/data/tech.ula/files/1 ~ と番号が割り振られています。例えば Debian の設定を書き換えてうまく起動しなくなった場合、Ubuntu から直接ファイルを修正することが可能です。

ただし他のストレージでは proot meta-file が直接見えてしまうので、meta-file に矛盾しない修正に留めておいた方が良いでしょう。ファイル内容の修正だけなら問題ありません。

● PC の X11 server に直接接続

VNC の場合は事前に UserLAnd 上で SSH Server を起動しておいてください。

Windows の場合は何らかの X11 server を起動しておきます。Microsoft Store にある X410 や VcXsrv 等。PC から (Windows の場合は WSL を想定) 下記のように SSH 接続します。

$ export DISPLAY=localhost:0.0
$ xhost +<AndroidIPAddress>
$ ssh -Y <AndroidIPAddress> -p 2022
$ xterm

関連エントリ
OS の中の Linux (WSL/Chrome OS/Android UserLAnd)
ARM CPU 上の開発環境とコンパイル時間の比較 (2) Pixel 3/UserLAnd
Android/Linux MaruOS その4
Nexus 7 上に開発環境をつくる (4) Ubuntu 13.04

Snapdragon 845 の浮動小数点演算速度

Snapdragon 845 の CPU は Qualcomm の Kryo 385 が使われています。big.LITTLE の 8 core (4+4) 非対称構成なので、ぞれぞれの CPU core 毎に測定してみました。下記はいずれも big.LITTLE 構成の CPU を使った SoC です。

Device Single thread Multi thread
SoC CPU Core big little big little Total
Snapdragon 845 Kryo385 4+4 22.3 13.7 84.4 54.9 139.3 GFLOPS
Exynos 7420 A57+A53 4+4 16.8 11.8 55.5 47.1 102.6 GFLOPS
Rockchip RK3399 A72+A53 2+4 16.1 11.8 32.1 47.2 79.3 GFLOPS
Snapdragon 808 A57+A53 2+4 14.5 11.2 29.1 44.9 74.0 GFLOPS
Snapdragon 821 Kryo 2+2 18.7 12.6 37.4 25.3 62.7 GFLOPS

・big = big core, little = little core
・Total = Multi thread の合計

vfpbench の単精度の結果のみ抜き出しています。単位は GFLOPS 。数値が大きい方が高速です。

表の CPU は Kryo, Kryo 385 (A75), Cortex-A57 いずれも 64bit x2 pipe なので、ピーク性能の差は純粋に core 数と clock 数で決まっています。

同様に little core の Cortex-A53/A55 も 64bit x2 の FP pipe を持っているので、数値上はほぼクロック差だけの違いとなっています。32bit 時代の little core Cortex-A7 と比べると性能は大きく上がっています。

初代 Kryo は Qualcomm 独自 core ですが、Snapdragon 845 の Kyro 385 は ARM Cortex-A75 + A55 がベースになっているようです。そのため Snapdragon 845 Kryo 385 の特性は初代 Kryo は異なっています。

例えば Kyro と Kyo 385 は積和命令のピーク演算はどちらも同一ながら、加算だけなら Snapdragon 821 の Kryo の方が 2倍速く回っています。

下記の表は 1 cycle に実行できる命令数 (IPC)

Device 64bit 128bit
CPU Core mul/fma add mul/fma add
Kryo (Snapdragon 821) 2 4 1 2
Kryo 385 (A75/A55)/A72/A57/A53 2 2 1 1

Kryo 385 のもとになった Cortex-A75 は ARM の新しい命令セットに対応しています。

Kryo 385 (A75/A55) ARMv8.2-A
Cortex-A72/57/53 ARMv8.0-A

以前の fp16 (半精度浮動小数点) 対応は変換命令だけでした。ロードストアは fp16 でも演算は fp32 以上に変換してから行います。v8.2 対応の A75/A55 では Deep Learning 向けに 16bit 命令が強化されています。fp16 のまま直接演算できるようになりました。

ARM FPU (VFP/NEON) の種類

例えば NEON (Advanced SIMD) では 128bit 時に 8並列で演算が行われます。単精度 32bit と比べると 2倍の速度が出るはずなので、余裕があったら試してみたいと思います。

テストに使った機種の詳細

Pixel 3 Snapdragon 845 SDM845 4+4 Kryo 385 (A75/A55) 2.8GHz 1.8GHz
Galaxy S6 Exynos 7420 4+4 Cortex-A57/A53 2.1GHz 1.5GHz
C101PA Rockchip RK3399 2+4 Cortex-A72/A53 2.0GHz 1.5GHz
ZenfoneAR Snapdragon 821 MSM8996 2+2 Kryo 2.3GHz 2.1GHz
Nexus 5X Snapdragon 808 MSM8992 2+4 Cortex-A57/A53 1.8GHz 1.4GHz

関連エントリ
ARM CPU 上の開発環境とコンパイル時間の比較 (2) Pixel 3/UserLAnd
ARM CPU の浮動小数点演算能力まとめ
HTC 10 Snapdragon 820 Kyro の浮動小数点演算能力
HTC 10 Snapdragon 820 Kyro の浮動小数点演算能力
iPhone SE, Apple A9 の浮動小数点演算速度
Raspberry Pi 3 の速度比較, Cortex-A53 の速度
ARM Cortex-A53 の浮動小数点演算速度とコンパイル時間の比較
iPod touch 6 の浮動小数点演算速度は Core 2 Duo ライン超え
iPad Air 2 (Apple A8X) の浮動小数点演算能力