Debian noroot 環境における物理キーボード配列の設定手法

# はじめに

[Debian noroot][DBNR] とは、 [Android OS][ANDR] 上において root 権限を取ることなく [Debian 環境][DEBI]を構築するためのアプリケーションです。
CPU の性能とメモリ容量が潤沢にある Android 端末であれば、 [Debian noroot][DBNR] の導入によって Android 端末上で非常に軽快な [Debian 環境][DEBI]を実現することができます。

[Debian noroot][DBNR] 環境において bluetooth 接続若しくは USB OTG 接続の物理キーボードを使用する場合、キーに刻印されている文字と異なる文字が入力されたり、特定のキーが有効にならない等、物理キーボードの打鍵性が著しく損なわれる場合があります。

また、 CapsLock キーを誤って押し下げて、物理キーボードの入力が意図せぬものとならないように、 CapsLock キーを Cntl キーに設定したり、 CapsLock キーと Cntl キーの押し下げ動作を交換する等の設定を行って、物理キーボードの打鍵性を向上させたい場合があります。

このような場合、通常の Linux ディストリビューションでは、 ```xmodmap``` コマンド若しくは ```setxkbcomp``` コマンドに基づく設定を行うのが一般的です。

しかし、 [Debian noroot][DBNR] 環境は、 [Android OS][ANDR] 上に [proot][PROT] コマンドを用いて実現した chroot に基づく環境であり、カーネルとプロセス領域及びハードウェア資源等を [Android OS][ANDR] と共有しているため、 [Debian noroot][DBNR] 環境における物理キーボードの設定は、 [Android OS][ANDR] での設定に依存しています。

また、 [Debian noroot][DBNR] 環境では、 [Debian noroot][DBNR] アプリの初期起動時において、物理キーボードの配列に関する設定を行うことが出来ます。

そこで、 [Debian noroot][DBNR] 環境を導入した [Android OS][ANDR] 端末において、端末に接続した物理キーボードの配列設定アプリを導入し、次に、[Debian noroot][DBNR] アプリの初期起動時に物理キーボードの配列の変更設定を行った後、 [Debian noroot][DBNR] 環境において ```xmodmap``` コマンドに基づく設定を行うことにより、 [Debian noroot][DBNR] 環境における物理キーボードの配列の設定が可能となりました。

本稿では、 [Debian noroot][DBNR] 環境において、物理キーボードの配列を設定する一連の手法について述べます。

まず最初に、 "[物理キーボード配列の設定に関する Android OS アプリによる設定手法][CHAP01]" の章において、 [Android OS][ANDR] 搭載の端末に接続された物理キーボードの配列の設定を行う為の [Android OS][ANDR] アプリの概要について述べます。

次に、 "[Debian noroot アプリにおける物理キーボード配列の設定手法][CHAP02]" の章において、 [Debian noroot][DBNR] アプリの初期起動時における物理キーボードの配列に関する設定の手法について述べます。

続いて、 "[xmodmap コマンドに基づく物理キーボード配列の設定手法][CHAP03]" の章において、 [Debian noroot][DBNR] 環境上で ```xmodmap``` コマンドに基づいた物理キーボードの配列の設定手法について述べます。

最後に、 "[結論][CHAP04]" の章において、本稿の結論について述べます。

なお、本稿においては、特段の断りのない限り、 [Debian noroot][DBNR] 環境を導入した端末の [Android OS][ANDR] のバージョンは 4.1 以降として記述することとします。

# 物理キーボード配列の設定に関する Android OS アプリによる設定手法

[前章][CHAP00]及び "[Debian noroot 環境の動作原理について][ZOQ1]" の投稿において述べた通り、 [Debian noroot][DBNR] 環境は、 root 権限を取得すること無く chroot 環境を構築するためのソフトウェアである [proot][PROT] を用いて構築された chroot 環境に基づいて実現されています。

従って、 [Debian noroot][DBNR] 環境は、 [Debian noroot][DBNR] 環境を導入した端末に搭載されている [Android OS][ANDR] とカーネルとプロセス領域及びハードウェア資源等を共有するため、 [Debian noroot][DBNR] 環境における物理キーボードの動作は、 [Debian noroot][DBNR] 環境を導入した [Android OS][ANDR] における物理キーボードの設定に依存します。

即ち、 [Debian noroot][DBNR] 環境において、物理キーボードの配列の設定を変更するには、まず最初に [Debian noroot][DBNR] 環境を導入した [Android OS][ANDR] 端末に、物理キーボードの配列を変更する為の [Android OS][ANDR] アプリを導入すれば良いことが判ります。

ここで、 [Android OS][ANDR] 端末において、物理キーボードの配列を変更する為の [Android OS][ANDR] アプリの例として、以下のアプリが挙げられます。

- 日本語配列キーボード向け
    - [NAKAJI Tadayoshi 氏][NAKA]による ["KCM for 日本語106/109キーボード"][APP1]
    - [knhnnh 氏][KNHN]による ["日本語106/109 かな入力対応キーボードレイアウト"][APP2]
    - [ShiftRot 氏][SHIF]による ["106/109ハードウェアキーボード配列変更(+親指Ctrl)"][APP3]
- 英語配列キーボード向け
    - [ShiftRot 氏][SHIF]による ["106/109 ハードウェアキーボード 親指Ctrlレイアウト (英語配列)（ベータ版）"][APP4]

本稿では一例として、 [ShiftRot 氏][SHIF]による ["106/109 ハードウェアキーボード 親指Ctrlレイアウト (英語配列)（ベータ版）"][APP4] の導入に基づいた物理キーボードの設定について述べます。

まず最初に、["106/109 ハードウェアキーボード 親指Ctrlレイアウト (英語配列)（ベータ版）"][APP4] を [Google Player][GPLY] 経由で導入し、**物理キーボードを接続した状態にしておきます。**

次に、 [Android OS][ANDR] より設定画面を表示させて、**設定画面のメニューから下記の画像のように「言語と入力」を選択します。**

![(設定画面)][IMG1]

続いて、下記の画像のように、**「言語と入力」のメニューから「物理キーボード」を選択します。**

![(言語と入力)][IMG2]

そして、下記の画像のように、**「物理キーボード」のメニューから、物理キーボードの配列の設定を変更する対象の IME を選択します。**

![(物理キーボード)][IMG3]

最後に、「キーボードレイアウト」のメニューから **[Android OS] 端末に接続した物理キーボードに適したキーボードレイアウトを選択して、キーボードの配列を設定します。**

![(キーボードレイアウト)][IMG4]

なお、実際の設定画面及び物理キーボード配列の設定手法については、 [Android OS][ANDR] のバージョン及び各アプリによって異なりますので、設定手法の詳細については、[Android OS][ANDR] 及び各アプリの技術資料及びマニュアル等を参照して下さい。

# Debian noroot アプリにおける物理キーボード配列の設定手法

[前章][CHAP01]において述べた手法に基づいて物理キーボード配列の設定を行っても、幾つかの物理キーボードのキーについては、 [Debian noroot][DBNR] 環境において、キーの刻印と実際の入力文字が異なる不具合が発生する場合があります。

この場合は、[Debian noroot][DBNR] アプリの初期起動時に、後述する [Device Configuration] メニューから物理キーボードの配列に関する設定を行うことが可能です。

本章では、最初に "[物理キーボードの配列設定変更のメニューの表示][SEC0201]" の節において、 [Debian noroot][DBNR] アプリの初期起動時に物理キーボードの配列設定変更のメニューを表示させる手法について述べます。

次に、 "[物理キーボードの配列設定の変更][SEC0202]" の節において、物理キーボードの配列設定変更のメニューから、設定対象となるキーの打鍵時の動作を設定する手法について述べます。

最後に、 "[Debian noroot 環境の起動][SEC0203]" の節において、[前節][SEC0202]までの設定が完了した後に、物理キーボードの配列設定変更のメニューを終了させ、 [Debian noroot][DBNR] 環境を起動させる手法について述べます。

## 物理キーボードの配列設定変更のメニューの表示

まず最初に、 [Debian noroot][DBNR] 環境を導入した [Android OS][ANDR] 端末から [Debian noroot][DBNR] アプリを起動します。すると、下記の画像のような起動画面が表示されます。

![(Debian noroot 環境の起動画面)][IMG5]

上記の画像のような画面が表示されたら、**[Debian noroot][DBNR] 環境が起動する直前に、画面上部の [CHANGE DEVICE CONFIGURATION] のボタンをタップします。**

すると、下記の画像に示す画面のように **[Debian noroot][DBNR] アプリの各種設定を変更するためのメニューである [Device Configuration] メニューが表示されます。**

![(Device Configuration Start)][IMG6]

## 物理キーボードの配列設定の変更

そして、[前節][SEC0201]において表示された **[Device Configuration] のメニューから、 [Remap physical keys] を選択します。**すると、下記の画像に示す画面のように、打鍵時の動作の変更を行うキーの選択を促す画面が表示されます。

![(Remap physical keys)][IMG7]

ここで、**打鍵時の動作を変更したいキー (例えば、 CapsLock キー) を打鍵すると、下記の画像に示す画面のように、打鍵時のキーの動作を選択するメニューである [Select Action] メニューが表示されます。**

![(Select Action)][IMG8]

そして、**打鍵時の動作を選択するメニュー [Select Action] から、打鍵時の動作 (例えば LCTRL = 左 Ctrl キーの動作) を選択する**と、再度 [Device Configuration] に戻ります。**続けて設定を行う場合は、再度このメニューから [Remap physical keys] を選択します。**

## Debian noroot 環境の起動

最後に、全ての設定が完了した後は、下記の画像が示す画面のように、 **[Device Configuration] のメニューから [OK] を選択すると、 [Debian noroot][DBNR] 環境が起動します。**

![(Device Configuration End)][IMG9]

[Debian noroot][DBNR] 環境の起動後は、設定を変更したキーを打鍵して、設定の通りに物理キーボードから入力が行われる事を確認します。 

# xmodmap コマンドに基づく物理キーボード配列の設定手法

ここで、[前々章][CHAP01]及び[前章][CHAP02]で行った設定においても、 [Debian noroot][DBNR] 環境において、物理キーボードのキーの刻印と実際の入力文字が異なる不具合が発生する場合は、 ```xmodmap``` コマンドに基づいた物理キーボード配列の設定を行う必要があります。

本稿では、一例として、 "\`" キー及び "~" キーが正しく打鍵出来ない不具合を解決する設定手法について述べます。なお、 "\`" キー及び "~" キーは、 keycode 9 及び keycode 49 のキーに刻印されているものとします。

まず最初に、下記の ```xmodmap``` の設定ファイルを作成し、ファイル名 ```/xmodmap``` として保存します。

```sh:/xmodmap
keycode   9 = grave asciitilde Escape Escape
keycode  49 = grave asciitilde grave asciitilde
```

次に、 [Debian noroot][DBNR] 環境の初期設定のためのシェルスクリプト ```/startx.sh``` に下記の記述を追記して [Debian noroot 環境][DBNR]を再起動します。

```sh:/startx.sh
...
rm -f /var/run/dbus/pid
rm -f ${HOME}/.config/xfce4/xfconf/xfce-perchannel-xml/keyboard-layout.xml

/usr/bin/xmodmap /xmodmap &	# ← /xmodmap ファイルのパスを引数にして xmodmap コマンドを起動する。
...
dbus-launch --exit-with-session sh -c 'xfce4-session ; setsid sh -c "cd /proc/ ; for f in [0-9]* ; do [ \$f = \$\$ ] || kill -9 \$f ; done"' &
...
```

[Debian noroot][DBNR] 環境の起動後は、設定を変更したキーを打鍵して、設定の通りに物理キーボードから入力が行われる事を確認します。 

なお、 [Debian noroot][DBNR] 環境における ```xmodmap``` コマンドに基づいた物理キーボード配列の設定に関する詳細については、```xmodmap``` コマンドに関する下記の投稿の記述を参照して下さい。

- [macinjoke 氏][MACI]による "[キーバインドの変更 Xmodmapの基本的な設定方法][QIT1]" の投稿
- [ka\_ 氏][KA__]による "[Esc と ~ を入れ替えてノート PC 本体のキーボードとタッチパッドはオフにする (HHKB Pro2 用設定)][QIT2]" の投稿
- [kbaba1001 氏][KBAB]による "[Readable Xmodmap][QIT3]" の投稿
- [roppy 氏][ROPP]による "[Bye bye Caps Key][QIT4]" の投稿

# 結論

[Debian noroot][DBNR] 環境を導入した [Android OS][ANDR] 端末に接続された物理キーボードからの入力について、キーの刻印の通りに文字入力が行われない問題を回避するために、まず最初に、 "[物理キーボード配列の設定に関する Android OS アプリによる設定手法][CHAP01]" の章において、 [Debian noroot][DBNR] 環境を導入した [Android OS][ANDR] 端末に、物理キーボードの配列を変更する為の [Android OS][ANDR] アプリを導入し、 [Android OS][ANDR] 端末に接続された物理キーボードに適した物理キーボード配列の設定を行いました。

次に、 "[Debian noroot アプリにおける物理キーボード配列の設定手法][CHAP02]" の章において、[前章][CHAP01]において、物理キーボードからの入力に関する問題が解決しない場合に、 [Debian noroot][DBNR] アプリの初期起動時に、 [Device Configuration] メニューから、 [Remap phisical keys] を選択することにより、物理キーボードの配列に関する設定を行いました。

最後に、　"[xmodmap コマンドに基づく物理キーボード配列の設定手法][CHAP03]" の章において、[前々章][CHAP01]及び[前章][CHAP02]において、物理キーボードの問題が解決しない場合に [Debian noroot][DBNR] 環境の起動スクリプトファイルである ```/startx.sh``` から ```xmodmap``` コマンドを起動することにより、物理キーボードの配列について設定を行いました。

以上の設定により、 [Debian noroot][DBNR] 環境において、物理キーボードを使用する場合に、キーに刻印されている文字と異なる文字が入力される等の問題が回避されることが示されました。

なお、本稿において前述した通り、 [Debian noroot][DBNR] 環境は、 [Android OS][ANDR] 上に構築された chroot 環境であるため、 **[Debian noroot][DBNR] 環境において物理キーボードの配列を設定する場合は、最初に [Android OS][ANDR] 上での物理キーボードの設定及び [Debian noroot][DBNR] アプリの初期起動時の [Device Configuration] メニューから設定を行うことを強く御勧め致します。**

# 謝辞

本稿の記述に当たって、まず最初に、 [Android OS][ANDR] 端末上で非常に軽快な [Debian 環境][DEBI]を実現することを可能にした Debian noroot 環境の開発者である [pelya 氏][PELY]に心より感謝致します。

そして、 "[物理キーボード配列の設定に関する Android OS アプリによる設定手法][CHAP01]" の章において前述した通り、 [NAKAJI Tadayoshi 氏][NAKA]と [knhnnh 氏][KNHN]及び [ShiftRot 氏][SHIF] を始め、 [Android OS][ANDR] 端末に接続された物理キーボードの配列の設定を行う為の各種  [Android OS][ANDR] アプリを開発された各氏に心より感謝致します。

また、"[xmodmap コマンドに基づく物理キーボード配列の設定手法][CHAP03]" の章において前述した通り、 ```xmodmap``` コマンドに基づく物理キーボードの配列の設定手法に関しては、 [macinjoke 氏][MACI]と [ka\_ 氏][KA__]と [kbaba1001 氏][KBAB]及び [roppy 氏][ROPP]の投稿を参考にしました。各氏には、心より感謝致します。

最後に、 [Debian noroot 環境][DBNR]と [Android OS][ANDR] 及び [Debian 環境][DEBI]の全ての事に関わる全ての皆様に心より感謝致します。

<!-- 各章及び各節へのリンク一覧 -->

[CHAP00]:#はじめに
[CHAP01]:#物理キーボード配列の設定に関する-android-os-アプリによる設定手法
[CHAP02]:#debian-noroot-アプリにおける物理キーボード配列の設定手法
[CHAP03]:#xmodmap-コマンドに基づく物理キーボード配列の設定手法
[CHAP04]:#結論
[SEC0201]:#物理キーボードの配列設定変更のメニューの表示による設定手法
[SEC0202]:#物理キーボードの配列設定の変更
[SEC0203]:#debian-noroot-環境の起動

<!-- 外部リンク一覧 -->

[DBNR]:https://play.google.com/store/apps/details?id=com.cuntubuntu&hl=ja
[ANDR]:https://www.android.com/intl/ja_jp/
[DEBI]:https://www.debian.org/index.ja.html
[PROT]:http://proot.me/
[PELY]:https://github.com/pelya
[ZOQ1]:https://qiita.com/z80oolong/items/4ef119a6af79a9276a0d
[GPLY]:https://play.google.com/
[NAKA]:https://play.google.com/store/apps/developer?id=NAKAJI+Tadayoshi
[KNHN]:https://play.google.com/store/apps/developer?id=knhnnh
[SHIF]:https://play.google.com/store/apps/developer?id=ShiftRot
[APP1]:https://play.google.com/store/apps/details?id=jp.tadnak25.inputdevices4j
[APP2]:https://play.google.com/store/apps/details?id=jp.ind.knhnnh.jpnkanalayouts
[APP3]:https://play.google.com/store/apps/details?id=jp.kcm.thumbctrl
[APP4]:https://play.google.com/store/apps/details?id=jp.kcm.thumbctrl.en.layout
[IMG1]:https://qiita-image-store.s3.amazonaws.com/0/86258/5bcb9794-624a-1f20-9381-915d1656de51.jpeg
[IMG2]:https://qiita-image-store.s3.amazonaws.com/0/86258/ebdcddf1-32f1-c632-6e66-dad3517c1d7a.jpeg
[IMG3]:https://qiita-image-store.s3.amazonaws.com/0/86258/85e27899-ea55-8f66-758e-d37e027a87ee.jpeg
[IMG4]:https://qiita-image-store.s3.amazonaws.com/0/86258/14d45df7-1187-af0c-c3d9-c0710ac3dc4c.jpeg
[IMG5]:https://qiita-image-store.s3.amazonaws.com/0/86258/24f1ce3b-1c3e-71f8-9a79-8a0f083ffbd6.jpeg
[IMG6]:https://qiita-image-store.s3.amazonaws.com/0/86258/91bf548b-cc6e-704b-14a1-7e3fbc72c4a6.jpeg
[IMG7]:https://qiita-image-store.s3.amazonaws.com/0/86258/86f5fd12-7aef-bf5b-7ea3-c0aeb5e5c6e2.jpeg
[IMG8]:https://qiita-image-store.s3.amazonaws.com/0/86258/19318cd3-f773-431e-c5b4-3e6bd2b548f3.jpeg
[IMG9]:https://qiita-image-store.s3.amazonaws.com/0/86258/35d1c33a-ec9b-6d13-973e-b5e67936c9a7.jpeg
[MACI]:https://qiita.com/macinjoke
[KA__]:https://qiita.com/ka_
[KBAB]:https://qiita.com/kbaba1001
[ROPP]:https://qiita.com/roppy
[QIT1]:https://qiita.com/macinjoke/items/746c0c0adb74cfdeb9e7
[QIT2]:https://qiita.com/ka_/items/47f12dd17780e33155a7
[QIT3]:https://qiita.com/kbaba1001/items/50448182c720f5a2bb59
[QIT4]:https://qiita.com/roppy/items/27d89366524aa737aa00