キーボードしかないpomera DM200でも快適X Window環境

# この記事について
[pomera DM200 の Linux 化のメモ](https://qiita.com/alt-core/items/d62c6447c607fbf6e8bf) では、マウスがない DM200 を活用するために、コンソール上の作業を前提に tmux を使った環境を整えました。

その後、キーボードで操作できる軽量ウィンドウマネージャ i3-wm を知り、導入してみたところ、ターミナルもブラウザもキーボードのみで操作できるようになり、とても快適でしたので、 X Window 環境に完全移行しました。

こちらの記事は X Window 環境の設定の記録です。

# TL;DR

フル速度で入力可能なキーボードと、ターミナルや Emacs が快適に動く CPU を備え、Dropboxでテキストファイルが同期できる程度のネットワーク機能があり、電池が丸一日持ち、さらには鞄に適当に放り込める600g程度の端末を探しているならば、Linux化した DM200 はまさに適任。
ただし、重いWebサイトのブラウジングの快適さは期待してはなりません。（軽いページなら uzbl で軽快にブラウジングできます）

# X Window の基本設定

## コンソールと X Window の切り替え

実は、仮想コンソールの仕組みにより、何も設定しなくても、X とコンソール画面を瞬時に行き来できます。

- fbterm 上で他の仮想コンソールに切り替えるときは、Alt + F1 〜 F6
- X 上で他の仮想コンソールに切り替えるときは Ctrl + Alt + F1 〜 F6

## .xinitrc

新しいユーザを作ると .xinitrc がないので、まずはひな形としてコピーしてきます。

```
$ cp /home/dm200/.xinitrc ~
```

これで startx を叩けば、とりあえず xfce4 が起動して、かな漢字変換もちゃんと動きます。

## マウスエミュレーション

この後 i3 + urxvt + uzbl で、基本操作はキーボードだけですむ環境を整えますが、とはいえ、X Window 上では、マウスが必要になることはあります。ということで、以下の参考ページでオススメされている keynav をインストールします。

[ポインティングデバイスのないKING JIM ポメラDM200でX Windowのマウス操作をする方法](http://hitoriblog.com/?p=52262)

```shell-session
$ sudo apt install keynav
$ cd; wget http://hitoriblog.com/.keynavrc
```

X を立ち上げるどこかで keynav も起動するようにしておきます。

この .keynavrc の詳細はリンク先を参照いただくとして、少し手を入れてみました。

```
Hiragana_Katakana start,cursorzoom 20 20
```

keynav を起動する度にマウスカーソル位置がリセットされるのが直感的ではなかったのと、使わないカタカナキーをショートカットとして活用しようということで、カタカナキーを押すだけでマウスモードに入るように。
マウスカーソルを vi 移動にして、ついでに、移動する度にマウスカーソルが付いてくるようにするのは以下のような感じです。

```
h move-left 10,warp
j move-down 10,warp
k move-up 10,warp
l move-right 10,warp
```

あとは Enter で左クリック、BackSpace で右クリックなど。お好みで。

```
space warp,click 1
shift+space warp,doubleclick 1
ctrl+space warp,drag 1
Return warp,click 1,end
shift+Return warp,doubleclick 1,end
ctrl+Return warp,drag 1,end
#Henkan_Mode warp,click 1,end
#Hiragana_Katakana warp,click 3,end
BackSpace warp,click 3,end
```

Space に keynav から抜けずにクリックする機能を持たせて、メニュー操作などをやりやすくしてみました。

# ウィンドウマネージャーを i3-wm に

デフォルトでは xfce4 が入っていますが、マウスのない DM200 ではどうにも操作がしにくい印象があります。また、軽量なウィンドウマネージャとは言え、メニュー操作などの重さも気になりました。

キーボード操作を主体とするウィンドウマネージャと、軽量なウィンドウマネージャは、集合が被っていまして、タイル型ウィンドウマネージャと呼ばれるジャンルを形成しています。dwm や、 awesome、xmonad などが人気どころかと思いますが、今回は i3 を試してみました。

いくら軽量にするためとはいえ、カスタマイズ＝ソース書換というのは硬派すぎませんかね・・・ ＞ dwm, xmonad

## 参考サイト

[i3 wm タイル型ウィンドウマネージャを使うことのメモ | Jenemal Notes](http://malkalech.com/i3_window_manager)
[i3 - ArchWiki](https://wiki.archlinux.jp/index.php/I3)
[i3 Window Manager を使ってみて分かったおすすめ設定集 - Qiita](https://qiita.com/gyu-don/items/d61b03e0222a7f1ce9f7)
[i3: i3 User’s Guide](https://i3wm.org/docs/userguide.html)

## インストール

```
sudo apt install i3
```

## .xinitrc

```text:~/.xinitrc
export LANG=ja_JP.UTF-8
export GTK_IM_MODULE=ibus
export XMODIFIERS=@im=ibus
export QT_IM_MODULE=ibus

xrdb -merge -I$HOME ~/.Xresources

ibus-daemon -drx&
keynav&
#exec startxfce4
exec i3
```

.Xresources を i3 は自動で読み込んでくれないようなので、自前で書く必要があります。

ibus の設定は xfce4 のときのままで、Mozc も問題なく動きました。

## 初回起動

初回起動時に .config/i3/config を作るか聞かれるので作ります。i3 のモディファイアキーは Win を選択すると、DM200 の Menu ボタンが使われますので、オススメです。

## デフォルトのキーバインドでの使い方

- Menu+d でランチャーが立ち上がるので、起動したいプログラム名を入力して立ち上げます。
    - Menu+Enter でターミナルが立ち上がります。
- プログラムを立ち上げる度に画面を分割して立ち上がってくるので、おもむろに Menu+w を押すと、それらが一気にタブになります。
- 同一画面内のウィンドウフォーカスの移動は Menu+矢印キー です。 Menu+jkl; でもOK。
- workspace という仮想デスクトップの概念もあります。Menu+数字キーで切り替わります。
    - 現在のウィンドウを workspace に移動させるには Menu+Shift+数字キーです。簡単。
- Menu+f で最大化することもできます。

とにかくキーボードでサクサク操作できることが魅力です。

# i3 のカスタマイズ

## config

自動生成されたコンフィグファイルを見れば、キーカスタマイズの方法は一目瞭然だと思います。使いやすいようにカスタマイズしましょう。

それ以外の設定項目について簡単に。

```
font pango:FontAwesome,Ricty Diminished,DejaVu Sans Mono 8
```

Ricty Diminished という見やすい日本語フォントが入っていますので、ありがたく使わせていただきます。アルファベットも Ricty は見やすいと思いますので、DejaVu より優先させています。また、後で電池アイコンで Font Awesome のものを使っているため、設定しています。apt のパッケージ名は fonts-font-awesome です。

```
bar {
        status_command i3status
        mode hide
}
```

i3 のステータスバーは十分に minimal だとは思いますが、mode hide を指定することで、Menu キーを押さないと表示されないようにもできます。



```
bindsym XF86PowerOff exec --no-startup-id sudo /opt/local/bin/sus
```

電源ボタンを押すと、tmux の項目でご紹介したサスペンド用のスクリプトが走ります。

```
bindsym $mod+Tab workspace next
bindsym $mod+Shift+Tab workspace prev
```

Menu+Tab でサクサク画面を切り替えられるようにします。

```
hide_edge_borders smart
```

１画面に１つしかアプリがない場合に、余計な枠を消します。素晴らしい。

```
assign [class="Firefox-esr"] web
```

特定のアプリを特定の名前の workspace 上で実行するようにします。Menu+数字 で移動できなくなるので一長一短ですね。先ほど設定した Menu+Tab で行き来はできます。
Menu+数字でダイレクト移動できるように、workspace ごとに役割を決めてしまって、ロード先を数字で指定してしまう手もあるかと思います。
class 名などは xprop コマンドで調査可能です。

## ランチャーの差し替え
```
$ sudo apt install j4-dmenu-desktop
```

Menu+d で表示されるランチャーの代替品が幾つかありますが、その中の j4-dmenu-desktop にしてみました。Desktopアプリのみ候補に表示するランチャーで、かつ起動が早い。

## i3bar でのバッテリ残量表示

一番下のステータスバーは i3bar が表示しますが、表示内容の整形は i3status が担当します。

i3status 2.11 では DM200 の /sys/class/power_supply/BATTERY/uevent のフォーマットに対応していませんが、 ~~master ブランチでは対応しています~~ ので、自前でビルドします。

（追記 2022/07：コメントで指摘をいただきましたが、2022年現在は master の先端だと上手くビルドできないようです。[2.12](https://github.com/i3/i3status/releases/tag/2.12) であれば以下の手順でビルドできますので、git clone したあとにディレクトリ内で git checkout 2.12 するなり、リンク先から zip で落としてくるなりしてください） 

```shell-session
$ sudo apt remove i3status
$ git clone https://github.com/i3/i3status.git
$ cd i3status
$ sudo apt install libconfuse-dev libyajl-dev libasound2-dev libiw-dev libcap2-bin libpulse-dev libnl-genl-3-dev
$ vi Makefile
asciidoc を使う manpage 関連をコメントアウト
$ make && sudo make install
$ mkdir -p ~/.config/i3status
$ cp i3staus.conf ~/.config/i3status/config
```

設定ファイルを書く

```text:~/.config/i3status/config
order += "battery 0"
...
battery 0 {
        path = "/sys/class/power_supply/BATTERY/uevent"
        format = "%status %percentage"
        format_down = "No battery"
        status_chr = "⚡ CHR"
        status_bat = " BAT"
        status_unk = "? UNK"
        status_full = " FULL"
        low_threshold = 10
        threshold_type = "percentage"
}
```

## rxvt-unicode-256color

uxterm も十分に軽量ではありますが、より軽さとキーボード操作を求め、rxvt-unicode をインストールします。

```
$ sudo apt install rxvt-unicode-256color
```

### キーボードでのバッファコピー
ログをキーボード操作でさかのぼるのは tmux を使っても可能ですが、urxvt の perl 拡張 [keyboard-select](https://github.com/muennich/urxvt-perls) を使えば単体でキーボード操作が可能です。

```
$ git clone https://github.com/muennich/urxvt-perls.git
$ mkdir -p ~/.urxvt/ext/
$ cp urxvt-perls/keyboard-select ~/.urxvt/ext
```

実際の利用設定は次項で。

### カスタマイズ

```
$ vi .Xresources
urxvt*font:     xft:Ricty Diminished:size=14
urxvt*letterSpace:        -1
urxvt*faceSize:       12
urxvt*background:             black
urxvt*foreground:             snow

urxvt*saveLines:              3000
urxvt*scrollBar:              false
urxvt*cursorBlink:            true
urxvt*cursorUnderline:        true
urxvt*pointerBlank:     true
urxvt*fading:   40
urxvt.iso14755:               false
urxvt.pastableTabs:           false

urxvt.perl-ext-common:        xim-onthespot,keyboard-select
urxvt.inputMethod:            ibus
urxvt.preeditType:            OnTheSpot

urxvt.keyboard-select.clipboard:        true

urxvt.keysym.Shift-Up: command:\033]720;1\007
urxvt.keysym.Shift-Down: command:\033]721;1\007

urxvt.keysym.Mod4-Hiragana_Katakana: perl:keyboard-select:activate
```

デフォルトで入っている xim-onthespot プラグインの設定でターミナル上でインラインで漢字入力ができるようになります。

keyboard-select の設定では Menu+カタカナ でバッファのキーボード操作モードに入ります。操作方法は vi ライク。
また、今回はしていませんが、perl:keyboard-select:search のキーボードショートカット設定をすれば、直接バッファを上方に検索してさかのぼれるようになります。

ちょっとだけ上に遡りたくなったときのために、Shift+上下で1行単位で画面をスクロールできるようにも設定しました。

`urxvt.iso14755: false` は Shift+Ctrl で ISO14755 モードという直接コード入力モードに入ってしまうのを無効化するためのものです。

`urxvt.pastableTabs: false` は、urxvt を使っている最中に、ターミナル上の emacs で7文字目から8文字目にかけてスペースを入力したときのカーソルの動きがおかしくなる不具合への対応です。 参考: [[SOLVED] Emacs + rxvt-unicode Cursor Bug](https://bbs.archlinux.org/viewtopic.php?id=130404)

### Ambiguous Width 対応

■やら→やらが半角の幅で表示されて色々ズレるのが East Asian Ambiguous Width 問題です。

最近 Mac の標準 Terminal にもこの問題の対応するオプションが追加されたりと、世間的には認知が広まって対応オプションも広まっているのですが、urxvt の作者は locale か libc で対応すべきことだと[主張しているよう](http://jlug.ml.debian.devel.narkive.com/FRBZuYf7/east-asian-width-problem-at-rxvt-unicode-ml)で対応オプションを用意するつもりはないようです。

ということで、[hamano/locale-eaw: East Asian Ambiguous Width問題と絵文字の横幅問題の修正ロケール](https://github.com/hamano/locale-eaw)を利用してロケール側で対応します。

```
$ wget https://raw.githubusercontent.com/hamano/locale-eaw/master/UTF-8-EAW-FULLWIDTH.gz
$ sudo cp UTF-8-EAW-FULLWIDTH.gz /usr/share/i18n/charmaps/
$ sudo vi /etc/locale.gen
...
#ja_JP.UTF-8 UTF-8
ja_JP.UTF-8 UTF-8-EAW-FULLWIDTH
...
$ sudo locale-gen
```

### 複数起動用スクリプト

```
$ vi /opt/local/bin/run_urxvt 
#!/bin/sh
urxvtc "$@"
if [ $? -eq 2 ]; then
  urxvtd -q -o -f
  urxvtc "$@"
fi
```

のようなスクリプトを使うと、複数の rxvt の起動がさらに早くなるとのこと。

# キーボード操作対応ブラウザ

やはりインターフェイスとしてのブラウザが必要になることはあるのですが、非力かつマウスのない DM200 でどこまで出来るのかはよくよく調べる必要があります。

## 試したものたち。

- Midori (標準インストール)
    - 色々なサイトで古いブラウザ警告を受ける
    - モダンなページを開くと落ちる
- Firefox ESR (`apt install firefox-esr firefox-esr-l10n-ja`)
    - xfce では死ぬほど重く感じたが、i3 上ではけっこうサクサク動いている気がする
- Chromium (`apt install chromium`)
    - Firefox より重いというわけではなさそう
    - モダンなサイトも大丈夫
- Surf (`apt install surf`)
    - Midori と同様
- [QuteBrowser](https://github.com/qutebrowser/qutebrowser) 
    - インストールがうまくいかず
- Uzbl (`apt install uzbl`)
    - キーボード操作できて安定していてとても軽い！！

## Vimperator

~~最新の Firefox では addon の形式が変わったため動かなくなっていて今更感はありますが、Firefox ESR + Vimperator で快適なキーボード生活が過ごせるようになりました。~~
→ 後述する uzbl の立ち上がりが早すぎて、今後、よほど互換性の必要なページがない限りはfirefox を立ち上げることはないでしょう。。。

### インストール方法

firefox-esr を起動した後に、アドオンマネージャーから Vimperator をインストールします。

### 基本操作

- o/t 現在のタブ/新しいタブでページを開く
- hjkl いつもの移動
- H/L ヒストリー戻る/ヒストリー進む
- f ヒントモードを起動し、ページ内の要素に対応する番号を押すだけで選んだことにする（超大事）
- Esc INSERTモードなどから通常モードに切り替える
- : コマンド (Tab で一覧がでます)
- ; 拡張ヒントモード (Tab で一覧がでます)
- Ctrl-n/p タブの切替
- Ctrl-w タブを閉じる（標準のショートカット）

### .vimperatorrc
```text:~/.vimperatorrc
set gui=none
```

gui=none にすると、タブもアドレスバーもなくなりますが、statusline に URL は出ており、ページタイトルは i3 のウィンドウタイトルに出るため、キーボードショートカットにさえなれてしまえば困りません。

# uzbl

firefox-esr は、やっぱり重くてしんどいため、軽量ブラウザを模索します。

最初は [surf](https://surf.suckless.org/) + [Keyboard link hinting](https://surf.suckless.org/files/link_hints/) を試していたのですが、キーボード操作用にチューニングされた軽量ブラウザとしては uzbl が軽量かつ操作しやすく、非常に快適です！

Vimperator 要らないのでは……。

```
$ sudo apt install uzbl
```

## キーボード操作

[UZBL-Browser - ArchWiki](https://wiki.archlinux.jp/index.php/UZBL-Browser) に操作などは載っていますが、代表的なものは

- o URLを開く
- hjkl ページの上下左右スクロール
- ctrl-f/ctrl-b 1ページスクロール/スクロールバック
- b/m ページ履歴戻し/進み
- fl ヒント移動（vimperatorと同等)
    - Fl で新しい窓 / FL でクリップボードにコピー
    - fi で入力欄へフォーカス
- gg グーグル検索
- w 新しいウィンドウを開く

タブ機能は i3 に任せた方が良いと思っていますが、uzbl-tabbed というものも一応あります。

## カスタマイズ

.config/uzbl/config でキーカスタマイズや Home の設定などが可能です。

```
@cbind <Mod1><Left> = back
@cbind <Mod1><Right> = front
```

など、お好みで。

## ユーザエージェントの変更
Twitter など、PC用のページが dm200 には重すぎても、スマートフォン向けサイトなら快適に閲覧できる場合があります。
uzbl なら、簡単にユーザエージェントを変えることもできます。

https://gist.github.com/evaryont/181515
こちらに古い uzbl 向けの UA 変更スクリプトがありますので、動くように手直しします。

```sh:~/.local/share/uzbl/scripts/switch_useragent.sh
#!/bin/sh                                                                                                        

[ -d "${XDG_DATA_HOME:-$HOME/.local/share}/uzbl" ] || exit 1
file=${XDG_DATA_HOME:-$HOME/.local/share}/uzbl/user_agents.txt

COLORS=" -nb #303030 -nf khaki -sb #CCFFAA -sf #303030"
if dmenu --help 2>&1 | grep -q '\[-rs\] \[-ni\] \[-nl\] \[-xs\]'
then
    DMENU="dmenu -i -xs -rs -l 10" # vertical patch                                                              
else
    DMENU="dmenu -i" # horizontal, oh well!                                                                      
fi

if [ -z "$1" ] ; then
    new_agent=`grep -v '^[[:space:]#]' $file | $DMENU $COLORS | perl -p -e 's/^.*?: ?//'`
else
    new_agent=`grep "^$1:" $file | perl -p -e 's/^.*?: ?//'`
    [ -z "$new_agent" ] && exit 1
fi
echo "set useragent = $new_agent" > "$UZBL_FIFO"
echo "reload" > "$UZBL_FIFO" # Reload the page so the new user agent is used.                                    
```

リンク先の user_agents.txt を ~/.local/share/uzbl/user_agents.txt に置きます。あとは uzbl にショートカットを設定するだけです。

```
$ vi ~/.config/uzbl/config
（前略）
# Open dmenu to select a user agent                                                                              
@cbind ZU = spawn @scripts_dir/switch_useragent.sh
# Immediately switch to the user agent, bypassing dmenu.                                                         
@cbind ZI = spawn @scripts_dir/switch_useragent.sh "iPhone"
@cbind ZA = spawn @scripts_dir/switch_useragent.sh "Android (G1) Browser"
```

これで、ZU で dmenu を使ったUA選択。ZA でAndroid向け UA、ZI でiPhone向けUAとなります。

user_agents.txt の内容が古すぎますが、uzbl の webkit も大分古いのでちょうどよいのではないでしょうか。。。

# 残りの気になっていること

## pomera を Bluetooth キーボードにしたい

pomera の標準環境では、pomera を Bluetooth キーボードとして iPhone などに接続できるモードがあります。
これを Linux 作業時にも簡単に実行できれば、ちょっとしたときに役に立ちそうです。
自由にキーアサインをカスタマイズできる bluetooth キーボードというのもいいですよね。

[ipad - How do I make Ubuntu appear as a bluetooth keyboard? - Ask Ubuntu](https://askubuntu.com/questions/229287/how-do-i-make-ubuntu-appear-as-a-bluetooth-keyboard)

ここで言及されている [hidclient](http://anselm.hoffmeister.be/computer/hidclient/index.html.en) を使えばできそうですが、すぐには使えなかったので一時保留中。

なお、ただビルドして実行すると "Failed to connect to SDP server" と怒られますが、 /etc/systemd/system/dbus-orig.bluez.service で ExecStart で bluetoothd --compat とオプションを付けると hidclient の起動は問題なく出来るようになります。

bluetooth の接続のほうに問題がありそうですが、深追いしていません。

## 2Dアクセラレーション

本当はGPUとして Mali 400 MP2 が乗っているくらいきちんとしたグラフィックスのハードウェアサポートがあるはずなのですが、x11perf の結果を見るとぱっとしません。おそらく 2D のハードウェアアクセラレーションが効いていなさそうに見えます。

http://rockchip.wikidot.com/graphics
http://rockchip.wikidot.com/xserver

このあたりに、glamor 2D acceleration を有効にすれば Xserver がかなり高速化されると書いてあるのですが、、、

（追記）
こちらの記事で、fbturbo を有効化する手順が記載されています。すばらしい！
https://qiita.com/maruime_no_alice/items/07633305fcaaa1f2a6fb

（追追記）
上の記事はリンク切れになっていました・・・。以下のページにも fbturbo の情報がありますが、文面と記事の投稿日時が4年くらいずれている気が・・・？ どこかからの転載なのでしょうか。
https://qiita.com/nagasawa_masato/items/96bebeccdb12429f9cce

## F2FS

SDカード上のファイルシステムとしては ext4 よりは F2FS のほうが性能が良さそうではありますが、それほど大きな差にはならなさそうですね。

[F2FS File-System Runs Great On SDHC Storage - Phoronix](https://www.phoronix.com/scan.php?page=article&item=linux_f2fs_sdhc&num=2)

## サスペンド・レジューム

現在は、wifi と bluetooth を off にしたあとに /sys/power/state に mem を設定するスクリプトを呼ぶことでサスペンド・レジュームを実行していますが、本来の debian にはもっと適切な枠組みがあるはずです。

https://wiki.archlinux.jp/index.php/Uswsusp
このあたりの情報を参考にすれば、毎回復帰するたびに wifi on を手動でし直しているのを解決できるのではと期待しています。

あと、蓋閉じでのサスペンドも本当はしたいところ。

ただ、実のところ、サスペンドの改善へのモチベーションがたいへん落ちている今日この頃です。何せ、夜充電しておけば、i3上でurxvt内のemacsとfirefoxが立ち上げたまま放置して、15時間後でもバッテリーは3割くらい残っているので、そもそもサスペンドさせる必要がなく・・・。

この持ち時間は、一定時間操作しないとモニターが消えてくれるためだとは思っていますが、普通に使っていたとしても /opt/bin/backlight 50 などと輝度を下げれば電池の持ちはかなりのものです。