月別アーカイブ: 2019年2月

UserLAnd : Android 9.0 で Ctrl + SPACE を使えるようにする

以前こちらで書いたように Android 9.0 Pie 以降は、外付けキーボード利用時に Control + SPACE のキー入力ができなくなっています。「キーボードレイアウトの切り替え」操作に割り当てられているためです。

ソフトウエアによっては Ctrl + SPACE を使いたい場合も多いので、無理やり使えるようにしてみました。

Ctrl + [SPACE] を乗っ取っているのは Android なので、Android 側で Ctrl を利用頻度の低いキーと交換してしまいます。例えば [F12] など。ただし入れ替えは UserLAnd + Linux (xmodmap) で識別可能なキーに限ります。本当は Caps が使えればよかったのですが Linux 側でうまく識別できませんでした。

もちろん Android 側では Ctrl キーが [F12] に置き換わってしまうため、ハードウエアキーボードで Ctrl を使った操作が困難になります。また xmodmap を使ったキー入れ替えは VNC/XSDL のみ有効で UserLAnd の SSH では使えません。

Step 1 : Android 側の入れ替え (kcm)

 [Ctrl] ←→ [F12]

・Android 側の「キーボードレイアウト切り替え操作」 は [F12]+[SPACE] になります。

Step 2 : UserLAnd Linux 側の入れ替え (xmodmap)

 [F12] ←→ [Ctrl]

・[F12] に偽装した本来の [Ctrl] キーを Ctrl として使えるようになります。

● (1) kcm キーレイアウト作成

Android 側でキー入れ替えを行うには kcm ファイルを作成し、新しいキーボードレイアウトを登録します。今回は下記 nakajit さんの code を利用させていただきました。

GitHub: nakajit/InputDevices4J

InputDevices4J/res/raw/keyboard_layout_japanese_ime_cc_ek.kcm を下記のように書き換えました。(Caps ←→ Ctrl, ESC ←→ 半全 が不要な場合は他のファイルを使用してください)

~
map key 58  CTRL_LEFT           # CAPS_LOCK
~

↓ 該当部分を下記のように修正

~
map key 58  F12                 # CAPS_LOCK
map key 88  CTRL_LEFT           # F12
~

● (2) 書き換えたプロジェクトを apk にビルドしてインストールします

● (3) 設定からレイアウトを選択

 設定→システム→言語と入力→物理キーボード→キーボードレイアウトの設定

keyboard_layout_japanese_ime_cc_ek.kcm の場合は「日本語 106/109 (IME用, C-C, E-H/Z)」を選びます。

選択すると Caps キーが [F12] に置き換わるので注意。

● (4) xmodmap での設定

UserLAnd から VNC を起動して xmodmap ファイルを作ります。

remove Control = Control_L
keysym Control_L = F12
keysym F12 = Control_L
add Control = Control_L

↑この内容を仮に .Xmodmap-F12 で保存したら

$ xmodmap .Xmodmap-F12

を実行します。

これで Android 9.0 でも UserLAnd (X11) 上で [Ctrl]+[SPACE] が使えるようになりました。

同じように、[半角/全角] キーや [変換] キーなども [F11], [F10] とか割り当ててしまえばおそらく UserLAnd 上で使用できるようになると思われます。

関連エントリ
Android Termux で日本語入力を行う / UserLAnd との併用
Android 9.0 と Bluetooth Keyboard による日本語入力
Android で動く Linux 環境 UserLAnd が XServer XSDL に対応
Oculus Go を文章書き&開発マシンにする
UserLAnd とブラウザ
Android 上の開発環境と UserLAnd
OS の中の Linux (WSL/Chrome OS/Android UserLAnd)
ARM CPU 上の開発環境とコンパイル時間の比較 (2) Pixel 3/UserLAnd

Android Termux で日本語入力を行う / UserLAnd との併用

普段使っている Note PC よりもハイエンドスマートフォンの方が性能が良いことが判明してから、Android を Note の代わりに活用する方法をいろいろ試しています。主な用途は外出時の議事録などのメモ取りとちょっとしたプログラミングです。

Android 上で root なしに利用できる開発環境として Termux と UserLAnd があります。

UserLAnd は Android 上に PC とほぼ同等の Linux 環境を構築可能で日本語入力もできます。その代わり proot のオーバーヘッドがありファイルアクセスが遅くなっています。また GUI が使えるものの GPU が使われておらず、PC と比べると画面描画は低速です。

Termux はファイルアクセスのオーバーヘッドがなく高速ですがパッケージがあまり多くありません。日本語入力にも非対応。

機能面では UserLAnd だけで済むのですが、速度面で少々難があるので工夫が必要です。下記はライブラリのコンパイル時間の比較です。

Google Pixel 3 (Android 9.0 Pie) Snapdragon 845
実行環境 Compiler Time (秒)
(1) Termux clang-7.0.1 32.6
(2) UserLAnd Debian + Termux VNC clang-7.0.1 34.5
(3) UserLAnd Ubuntu 18.04 SSH clang-6.0.0 72.9
(3) UserLAnd Debian Stretch VNC clang-3.8.1 220.4
(3) UserLAnd Debian Stretch SSH clang-3.8.1 219.0
Essential Phone PH-1 (Android 9.0 Pie) Snapdragon 835
実行環境 Compiler Time (秒)
(1) Termux clang-7.0.1 38.4
(2) UserLAnd Ubuntu + Termux VNC clang-7.0.1 40.5
(2) UserLAnd Debian + Termux VNC clang-7.0.1 41.7
(3) UserLAnd Debian Stretch VNC clang-3.8.1 423.6
(3) UserLAnd Debian Stretch VNC clang-4.0.1 456.9
(3) UserLAnd Ubuntu 18.04 VNC clang-6.0.0 95.6
(3) UserLAnd Arch SSH clang-7.0.1 107.0

・Time (秒) の値が小さい方が高速

(1) = Termux のコンソールから直接実行
(2) = UserLAnd から ssh で Termux に login して実行
(3) = UserLAnd 上で直接実行

Termux (1) が一番速く、UserLAnd 経由で Termux を利用した場合 (2) もほぼ速度が落ちずに済んでいます。

Termux と比べると UserLAnd は 2〜12倍くらい遅くなっています。かなりばらつきがあり Debian が極端ですが原因はわかっていません。

UserLAnd は Desktop アプリの利用や日本語入力などの環境として利用して、Termux でできる作業は Termux で行うのが効率良いことがわかります。

上の結果 (2) では Desktop 上の LXTerminal から Termux に ssh 接続していますが、ウィンドウ上の Terminal の描画は遅くなります。パフォーマンスが低いデバイスでは X11/VNC ではなく UserLAnd の SSH から Termux にログインすることをお勧めします。こちらの方が Terminal の描画は高速で、uim-fep の日本語入力が使えるようになります。

● Termux で日本語入力を行う方法

1. UserLAnd に任意の Distribution をインストールして日本語環境を設定
2. Termux 上で sshd を起動
3. ssh で Termux にログイン

● 1. UserLAnd の設定

4通りの方法を wiki にまとめました。

Ubuntu + SSH コンソールでの日本語入力 (uim-mozc)
Debian + SSH コンソールでの日本語入力 (uim-mozc)
Ubuntu + VNC デスクトップでの日本語入力 (fcitx-mozc)
Debian + VNC デスクトップでの日本語入力 (uim-mozc)

その他 UserLAnd 関連はこちら
Android の上の開発環境: UserLAnd

● 2. Termux の設定と sshd の起動

Termux では予め sshd を起動しておく必要があります。手順は下記の通り。ssh でログインするためにはパスワードの設定が必要です。

$ pkg update
$ pkg install openssh
$ passwd
パスワードの設定
$ sshd

● 3. Termux へのログイン

UserLAnd から Termux へのログイン方法。VNC (LXDE desktop) を使う場合は LXTerminal を使ってください。

$ ssh localhost -p 8022

●実際に使用してみて

Snapdragon 845 クラスのスマートフォンでは Ubuntu + VNC + Termux で十分だと感じます。議事録などのメモ用途で使う場合は、Bluetooth Keyboard があれば Note PC 代わりになりますし、外出時のコードの確認にも使えます。

どこでも作業空間を作り出せる Oculus Go も非常に魅力なのですが、VR にパワーが取られてしまい VNC は重くなります。テキストエディタの作業は SSH Console の方をお勧めします。もっとパワーのあるスタンドアロン機種や、ハイエンド機種 + GearVR/Daydream だったらもう少し快適な作業ができるかもしれません。

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

関連エントリ
Android 9.0 と Bluetooth Keyboard による日本語入力
Android で動く Linux 環境 UserLAnd が XServer XSDL に対応
Oculus Go を文章書き&開発マシンにする
UserLAnd とブラウザ
Android 上の開発環境と UserLAnd
OS の中の Linux (WSL/Chrome OS/Android UserLAnd)
ARM CPU 上の開発環境とコンパイル時間の比較 (2) Pixel 3/UserLAnd

Android 9.0 と Bluetooth Keyboard による日本語入力

Termux や SSH Terminal では外付けの Bluetooth Keyboard を使うと快適なのですが、Android 上の日本語入力はなかなか思い通りにならないことがあります。OS Version や端末、キーボードソフトウエアによってキー操作や挙動が異なっています。また Terminal 上で On/Off できるかどうかもソフトによって差があります。

例えば Android 9.0 Pie では下記の操作が有効になっています。

(1) [Win] + [SPACE] キーボードの切り替え (Gboard←→ATOK 等)
(2) [SHIFT] + [SPACE] 他 Gboard/Google 日本語入力の 日本語 On/Off
(3) [Ctrl] + [SPACE] 物理キーボードレイアウトの切り替え (QWERTY←→Dvorak等)

(1) キーボード切り替え (Win + SPACE)

複数のキーボードソフトを入れているとそれらを順番に切り替えます。例えば Google 日本語入力 と ATOK を両方有効にしているなら [Win] + [SPACE] で交互に切り替わります。

(2) 日本語入力切り替え

日本語入力切り替え操作はキーボードソフトウエアによって異なります。

ハードウエアキーボード利用時の日本語入力切り替えキーまとめ

Keyboard Software [半全]以外の On/Off キー [半全] ALT+[半全] Term
Gboard (+日本語) [SHIFT] + [SPACE] Y
Google 日本語入力 [SHIFT] + [SPACE] Y
ATOK for Android [ALT] + [SPACE] / [変換] Y Y Y
FSKAREN for Android 無し Y Y
Wnn Keyboard Lab [SHIFT] + [SPACE] Y Y

[半全] = [半角/全角] キーで切り替えられるかどうか
ALT+[半全] = [ALT] + [半角/全角] キーで切り替えられるかどうか
Term = Termux/ConnectBot 上で日本語 On/Off できるかどうか (変換中文字表示なし)

ATOK は複数の操作ができますがどれも同じ機能です。ATOK は [変換] キーが使えます。FSKAREN / Wnn は英数時に直接入力と変換入力切り替えの使い分けができます。ただし FSKAREN と Wnn は操作が逆でした。

Keyboard Software On/Off (直接入力) 英数/日本語 (変換入力)
Gboard (+日本語) [SHIFT]+[SPACE] / [半全]
Google 日本語入力 [SHIFT]+[SPACE] / [半全]
ATOK for Android [ALT]+[SPACE] / [半全] / [ALT]+[半全] / [変換]
FSKAREN for Android [ALT]+[半全] [半全]
Wnn Keyboard Lab [半全] [SHIFT]+[SPACE] / [ALT]+[半全]

(3) 物理キーボードレイアウト切り替え (Ctrl + SPACE)

これは Android 9.0 から追加された操作で Android 8.1 以前にはありません。以降は Essential Phone、Android 9.0 での画面です。

Bluetooth または USB Keyboard をつないだ状態で設定を開きます。「システム」→「言語と入力」→「物理キーボード」を開くとキーボードの名前が表示されているので選択

AndroidKeyboard

「キーボードレイアウトの選択」画面がでます。

AndroidKeyboard

右下の「キーボードレイアウトの選択」を選ぶと複数のレイアウトを選択できます。

AndroidKeyboard

複数のレイアウトにチェックをれて戻ると下記の通り。この画面でようやく Ctrl+スペース の操作が割り当てられていることがわかります。

AndroidKeyboard

おそらく QWERTY と Dvorak のように、キーボードレイアウト自体をいつでも切り替えられるように設けられた機能だと思われます。

ただし弊害があります。この機能が原因で Android 9.0 では Terminal アプリケーションで [Ctrl] + [SPACE] の操作ができなくなっているのだと思われます。例えば Termux や SSH Terminal 、UserLAnd や VNC 上で [Ctrl] + [SPACE] を使おうとしても、入力できずにレイアウトが切り替わってしまいます。

[Ctrl]+[SPACE] で日本語切り替えしたい場合や、Emacs のマーク操作で困ります。Android 8.1 以前は問題なく [Ctrl]+[SPACE] が使えました。

● Termux で日本語入力を行う

Termux 上で Android 上の日本語変換を使う場合は、切り替え操作が思うようにできないだけでなく変換途中の文字列が表示されない問題もあります。なので、いっそ Android 側の日本語入力機能を諦めてしまうのも一つの手です。

UserLAnd のおかげで Android 内に簡単に Linux Distribution をインストールできるようになりました。つまり UserLAnd を GUI&日本語入力対応の SSH Terminal として利用します。

Termux 上で予め sshd を立ち上げてから UserLAnd 上で ssh localhost -p 8022 で接続します。これで Termux 上で uim-mozc や fcitx-mozc を使った日本語入力↓ができます。

UserLAnd_Termux

ただし Android 9.0 の場合は Ctrl+SPACE が使えない問題は相変わらず残ります。

UserLAnd 使うなら、そもそも Termux は必要ないのではないかと思うかもしれませんが、詳しくは次回に続きます。
続き: Android Termux で日本語入力を行う / UserLAnd との併用

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

関連エントリ
Android で動く Linux 環境 UserLAnd が XServer XSDL に対応
Oculus Go を文章書き&開発マシンにする
UserLAnd とブラウザ
Android 上の開発環境と UserLAnd
OS の中の Linux (WSL/Chrome OS/Android UserLAnd)
ARM CPU 上の開発環境とコンパイル時間の比較 (2) Pixel 3/UserLAnd

Snapdragon 835 と 845 のコンパイル時間の比較&浮動小数点演算能力

Snapdragon 835 (MSM8998) のデータを追加しました。コンパイル時間と VFP Benchmark の結果を載せています。ついでに Oculus Go でもコンパイル時間を調べてみました。(前回1) (前回2)

●コンパイル時間の比較 (Termux+clang)

Smartphone SoC RAM Thread Time 速度比
Pixel 3 Snapdragon 845 4GB 8/8 32 4.2x
Essential Phone Snapdragon 835 4GB 8/8 38 3.6x
Galaxy S6 Edge Exynos 7420 3GB 8/8 77 1.8x
ZenFone AR Snapdragon 821 8GB 4/4 111 1.2x
Nexus 5X Snapdragon 808 2GB 6/6 135 1.0x
Oculus Go Snapdragon 821 3GB 4/4 275 0.5x

・Time (秒) が小さい方が高速。

●浮動小数点演算能力ピーク値 (VFPBenchmark)

Smartphone SoC RAM Thread big/L GFLOPS
Pixel 3 Snapdragon 845 4GB 8/8 84/55 139.3
Essential Phone Snapdragon 835 4GB 8/8 75/59 134.5
Galaxy S6 Edge Exynos 7420 3GB 8/8 56/47 102.6
Nexus 5X Snapdragon 808 2GB 6/6 29/45 74.0
ZenFone AR Snapdragon 821 8GB 4/4 37/25 62.7

・GFLOPS が大きい方が高速。

演算ユニットの数が同じなので浮動小数点演算ピーク値はクロック数に比例した結果となっています。特に Total 値では 835 と 845 の差が少なくほぼ同じくらいの数値です。

それと比べるとコンパイル時間の方には若干差が付きました。CPU 自体も 2 命令 decode の Out-of-order から 3 命令 decode Out-of-order に増えていますので、Snapdragon 845 は big core のクロック差だけでなく IPC も向上しています。ベースとなった CPU core は ARM によると 20% 以上速いとのこと。UserLAnd + Termux を使っていても VNC 経由なのに十分満足できるもので、過去に使った Nexus 7 (2012) や Nexus 5 の Linux とは別物です。

Oculus Go で動く UserLAnd や Termux はどこでも大画面で作業場が作れるので魅力的なのですが、ビルドは残念ながら低速です。同じ Snapdragon 821 の Zenfone AR と比べても 2.5 倍時間がかかりました。使用したのは Oculus TV + Termux です。VR 空間の描画にパフォーマンスが取られているのだと思われます。VR 描画は両眼分必要で、また処理落ちは酔いにつながるため VR 描画が優先されます。

●スマートフォン以外のデバイスを含めたコンパイル時間の比較

他のデバイスとの比較表も更新しました。835 も十分速いです。ただし条件が一定ではないので参考程度にお願いします。特に Windows 10 PC は仮想環境を使っています。

Device SoC/CPU RAM Thread Time
Desktop W10+VMware Ryzen 7 1800X 16GB 16/8 24
Desktop W10+WSL Ryzen 7 1800X 32GB 16/8 26
Desktop W10+VMware Core i7-6700K 16GB 8/4 29
Pixel 3 Snapdragon 845 4GB 8/8 32
Desktop W10+VMware Core i7-4790K 8GB 8/4 35
Essential Phone Snapdragon 835 4GB 8/8 38
Desktop W10+VMware Core i7-4770 8GB 8/4 39
MacMini 2012 Core i7-3615QM 16GB 8/4 43
Galaxy S6 Edge Exynos 7420 3GB 8/8 77
Desktop Linux A10-7870K 8GB 4/2 82
Chromebook C101PA RK3399 4GB 6/6 87
MacBook Pro 2013 Core i5-3210M 8GB 4/2 97
Desktop Linux Celeron J1900 8GB 4/4 108
ZenFone AR Snapdragon 821 8GB 4/4 111
Nexus 5X Snapdragon 808 2GB 6/6 135
Tegra Note 7 Tegra 4 1GB 4/4 148
Note W10+WSL Atom x7-Z8700 4GB 4/4 200
Chromebook C720 Celeron 2955U 4GB 2/2 222
Nexus 9 Tegra K1 2GB 2/2 272
Nexus 7 2013 Snapdragon S4 Pro 2GB 4/4 275
Oculus Go Snapdragon 821 3GB 4/4 275
MeMO Pad 7 ME176C Atom Z3745 1GB 4/4 312

・Time (秒) が小さい方が高速。

関連ページ
VFP Benchmark Log 計測結果まとめ

関連エントリ
Snapdragon 845 の浮動小数点演算速度
ARM CPU 上の開発環境とコンパイル時間の比較 (2) Pixel 3/UserLAnd
ARM CPU 上の開発環境とコンパイル時間の比較
AMD CPU Ryzen とコンパイル時間の比較 (2)
AMD CPU Ryzen とコンパイル時間の比較
ARM CPU の浮動小数点演算能力まとめ
HTC 10 Snapdragon 820 Kyro の浮動小数点演算能力
iPhone SE, Apple A9 の浮動小数点演算速度
Raspberry Pi 3 の速度比較, Cortex-A53 の速度
ARM Cortex-A53 の浮動小数点演算速度とコンパイル時間の比較
2955U vs N3150/J1900/Athlon5350 (コンパイル時間の比較)
iPod touch 6 の浮動小数点演算速度は Core 2 Duo ライン超え
Raspberry Pi 2 で速くなったコンパイル時間の比較
iPad Air 2 (Apple A8X) の浮動小数点演算能力
BayTrail vs Kabini (Celeron J1900 vs Athlon 5350)
コンパイル時間の比較 BayTrail
Atom vs Core i7

Android/Oculus Go/Daydream の画面をミラーリングするツールを作ってみた

HTC Vive や Oculus Rift など、PC 向け VR HMD ではモニタ画面にもゲームの映像が出ます。周囲からも VR 内部がどんな状態なのかある程度は見えるようになっています。モバイルやスタンドアロンタイプの VR HMD だと本人にしかわからないので、デモなど人に見せたい場合は何らかの手段が必要です。

Android に標準で用意されている Chromecast や Miracast を使うのが簡単です。Oculus Go の場合もシェアボタンからリンクされているスマートフォンや Chromecast に出力できるようです。

下記は Daydream を Miracast で出力したものです。モニタ直撮り。使用した Miracast アダプタは Microsft Wireless Display Adapter

Miracast

また Windows 10 には Miracast 機能があるので、アダプタがなくても Wi-Fi があれば直接 PC に表示することができます。

(1) 設定→システム→この PC へプロジェクション

 「セキュリティで保護されたネットワーク上のどこでも利用可能」

(2) スタートメニューから「接続」というアプリを起動。

この状態で HDMI の Miracast アダプタと同じように繋がります。なおこの PC は Wi-Fi を内蔵していますが LAN には有線接続しました。(Wi-Fi は Miracast 専用)

↓実際に ZenFone AR + Daydream でつないだところ。(Pixel 3 は Miracast 非対応でした)

Windows10 Miracast

他にもアプリを使う方法があります。様々なサイトで Vysor というソフトが紹介されていました。このソフトは画面のミラーリングだけでなく PC から操作もできるようです。

ただし接続に adb を使っており開発者モードを有効にする必要があります。ワイヤレス接続も adb の tcp 接続を使っているようです。

VR では PC からの操作は不要なのと、adb を使うなら python で作れそうな気がしたので作ってみました。

GitHub: android_mirrortool

下記は android_mirrortool を使って Oculus Go を Windows PC にミラーリングしたところです。

android_mirrortool

Android には画面を録画する機能があります。それを adb 経由でストリーミングしているだけです。python の opencv を使っています。音は出ません。Windows と Linux で動きます。

● Windows の場合

(1) Android SDK を install し adb.exe にパスを張っておく

  AndroidStudio をそのまま install した場合はこの辺です。
  C:/Users/<USERNAME>/AppData/Local/Android/sdk/platform-tools

(2) python 3.x を install

(3) パッケージ pywin32 と opencv-python を install する

pip をを使ってインストールする場合

pip3 install pywin32
pip3 install opencv-python

●使い方

(1) 開発者モードにして adb でつないでおきます。

(2) 「 python android_mirror.py 」を実行します。

画面に動きがないと Mirror Window が表示されないので最初はいろいろ操作して画面を動かしてみてください。終了は ESC キーです。

デフォルトで Full HD になります。VR が処理落ちする場合、または Wi-Fi で adb 接続する場合はレートやサイズを落としてください。

python android_mirror.py --bitrate 4m --size 1280x720

●Linux の場合

下記の操作は Debian 系

$ sudo apt install python3 python3-pip
$ pip3 install opencv-python
$ sudo apt install adb

開発者モードにして adb でつながったら

$ python3 android_mirror.py

●スクリーンキャプチャ

-c をつけるとスクリーンキャプチャになります。png で保存します。

python android_mirror.py -c

関連エントリ
Oculus Go で一般 Android アプリを起動できるランチャーを作ってみた
Oculus Go を文章書き&開発マシンにする
Gear VR のヘッドセットの種類のまとめ
Oculus Go は VR ができる新しい携帯ゲーム機