pomera DM200 の Linux 化のメモ

# この記事について
KINGJIM の [pomera DM200](http://www.kingjim.co.jp/pomera/dm200/) を Linux 化した手順を、自分の備忘のためにメモするものです。

# DM200 の Linux 化
DM200 は基本的にはテキストライティングに特化した pomera の独自エディタが動く端末で、それだけでも十二分に価値のある製品です。しかし、内部的には組み込み Linux が動作しているようで、特殊なブート手順を踏むことで SD カード上のスクリプトを実行することができます。これを利用し、Debian をインストールするインストーラが存在します。

pomera として使っている間は、WiFi や Bluetooth をかなり限定した形でしか利用できませんが、Debian が動くようになれば、X Window の利用も含め、格段にできることが増えます。

しかも、元の pomera ソフトウェアとのデュアルブートとなりますので、ATOK+各種辞書を活用したライティング専用マシンとして pomera を使いつつ、どうしてもネットに繋ぎたい時だけ Debian を立ち上げるなど、良いところ取りが可能です。

基本的には以下の２つのページを見れば Linux 化は行えます。

- [Linux on Pomera DM200 人柱版 その2 – 記録](https://www.ekesete.net/log/?p=8940)
- [KING JIM ポメラDM200でEmacs、Vim、Ruby、Pythonが動くなんて素敵すぎる！](http://hitoriblog.com/?p=51448)

## この記事の独自なところ

- デフォルトの dm200 以外にユーザを作ります
- **パスワードをちゃんと変えます**
    - デフォルトで sshd が立ち上がっているようなので、重要です！
- /opt/local 以下に、インストーラが生成するもの以外のスクリプト類をまとめます
- ~~X ではなく、コンソールの fbterm 上の tmux で快適に使える環境を目指します~~ → 結局 X Window の世界に行くことにしまして、その紹介は[別エントリ](https://qiita.com/alt-core/items/6b16f12ed196bcba1b58)で。
    - uim-fep の ON/OFF に変換/無変換キーを使う
    - 電源ボタンによるサスペンドを tmux 上でハンドリングする

# Debian のインストール
大まかな流れは、前述のページの通りですので、箇条書き程度に。

- 16GB の SD カードを購入
- DM200_nand_backup_restore_v0.1.zip の中の backup フォルダを SD カードにコピー
- 電源が切れている DM200 に差し込み、右 SHIFT + ALT + 電源ボタン（以下、起動キーコンビと呼称）を pomera のロゴが出るまで長押し
- backup の表示が出るので、10分くらいまつ
- SD カードの backup フォルダ以下に eMMC のバックアップデータが入っているので、PC で安全な場所に退避
    - 最初は4GB程度あるが、Zip で圧縮すると400MB程度に。
- フリーのイメージライティングツール [Etcher](https://etcher.io/) をインストールしてくる
- DM200_debian_installer_v0.2.zip を Etcher を使って SD カードに焼く
- SD カードを差し込み起動キーコンビ
- 一瞬でインストール終了
- リブートすると pomera に行ってしまうので、電源を切って起動キーコンビ
- ユーザ名 dm200 / パスワード dm200 でログインできることを確認する
- sudo /sbin/halt -p でシャットダウン
- SD カードを取り出し、PC で　test_kernel_d29.zip と v02_updater01.zip を SD カードにコピー
    - PC 上で解凍までしておくとスムーズ
- 起動キーコンビで root/root で入る
- ```mount /mnt/vfat```
- /mnt/vfat から zip を解凍した物を ~ にコピー。
- 更新用の sh を実行し、reboot
- sudo の設定
    - secure_path への追加
    - NOPASSWD

```
$ sudo visudo
secure_path に /opt/bin:/opt/local/bin を追加
NOPASSWD: を追加
```

- パスワード変更
    - root/root は流石に・・・

```
$ passwd
$ sudo passwd
```

- ユーザ追加
    - ```# adduser ユーザ名```
    - dm200 ユーザを使い続けたくない場合に
    - ユーザを追加した場合、```sudo vigr``` で dm200 が参加しているグループに新規ユーザも追加する
        - video グループに追加を忘れると fbterm できなくなる、など

- 起動時に自動ログインする設定

```
$ sudo vi /lib/systemd/system/getty@.service
ExecStart=-/sbin/agetty --noclear -a <自動ログインユーザ名> %I $TERM
```

- pomera 側と整合性を取るための RTC を localtime で保存する設定を行う（Linux的には非推奨）

```
$ sudo touch /etc/adjtime
$ sudo timedatectl set-local-rtc 1
```

- ctrl と caps lock を入れ替える

```
$ sudo vi /etc/default/keyboard
XKBOPTIONS="ctrl:nocaps"
```

- Wi-Fi 設定
    - 平文で psk を書くのも気持ち悪いので、気休めではありますが、wpa_passphrase コマンドで。

```
# cd /etc/wpa_supplicant
# mount /mnt/vfat
# cp /mnt/vfat/settings/wpa_supplicant.conf .
# wpa_passphrase AP名 パスフレーズ >> wpa_supplicant.conf
# vi wpa_supplicant.conf
いい感じにマージ
```

- apt
    - お好きな物を

```
# apt update
# apt install less python-pip python3-pip w3m zip
```

- fbterm
    - ●など一部の記号を全角扱いしないと、フォント表示とずれます
        - この設定をすると今度は tmux で分割したときの罫線が全角表示されて崩れるという問題が発生します。tmux のバージョンが上がれば ACS 強制設定により改善されるはず。参考）[tmuxの罫線素片をACSに強制する - Qiita](https://qiita.com/yanma/items/2644e6db6f3bcf249690)

```
vi ~/.fbtermrc
ambiguous-wide=yes
```

- setuid

```
chmod u+s /sbin/halt /sbin/reboot
```

- zsh
    - apt install zsh git
    - [Zsh + Prezto で快適コマンド環境を構築する ｜ Developers.IO](https://dev.classmethod.jp/tool/zsh-prezto/)
    - vi .zpreztorc で theme をお好きなものに
    - vi .zshrc で path に /opt/bin /opt/local/bin を足したり、sudo の補完が効くように ```zstyle ':completion:*:sudo:*' command-path /opt/bin /opt/local/bin 以下略``` を設定したり

# fbterm + tmux で生活できるかの挑戦

## /opt/local のファイル群

[KING JIM ポメラDM200でEmacs、Vim、Ruby、Pythonが動くなんて素敵すぎる！](http://hitoriblog.com/?p=51448) のスクリプトをいただいて、/opt/local/bin 以下に入れます。

```bash:/opt/local/bin/batt
#!/bin/bash

battery_status=`/opt/bin/battery2`

if [[ ${battery_status} =~ remain_capacity\ \=\ ([0-9]+),\ status ]]; then
    remain=`expr ${BASH_REMATCH[1]} / 42`
    echo "${remain}"
fi
```

```bash:/opt/local/bin/sus
#!/bin/bash

tmux display suspending... >/dev/null 2>&1

if [ ! $(pgrep -fo "sus2ram") == "" ]; then
    exit
fi

sudo /opt/bin/sus2ram >/dev/null 2>&1
```

また、tmux で電源ボタンや変換・無変換を認識させるための keymap ファイルを /opt/local/share/keymaps/dm200_console.map として作成しました。

```text:/opt/local/share/keymaps/dm200_console.map
keymaps 0-255
keycode 41 = F11
keycode 116 = F12
keycode 125 = PageUp
keycode 92 = End
keycode 94 = Home
keycode 93 = PageDown
```

特殊なキーはそのままではコンソール上では認識してくれませんが、このようなファイルを作って loadkeys コマンドで読み込むことで、認識するキーに割り当て直すことが可能です。

tmux が認識するキーは、tmux のソースを読めば分かります。

[tmux/key-string.c at master · tmux/tmux](https://github.com/tmux/tmux/blob/master/key-string.c)

ファンクションキーは F12 までしか認識しませんが、DM200 は F10 までしかありませんので、F11, F12 が利用できます。
また、Home, End, PageUp, PageDown も DM200 にはありませんので、有難く使わせていただきましょう。あとは今回は使いませんでしたが、NUMPAD 側のキーなども利用できそうです。

なお、特殊キーの keycode は showkey コマンドを使って実際にキーを押してみることで調べることが出来ます。

上のキーマップファイルでは、以下のような再割り当てを行っています。

- 全角/半角 -> F11 
- 電源 -> F12
- Menu ボタン -> PageUp
- 変換 -> End
- 無変換 -> Home
- かな -> PageDown

## fbterm と uim-fep と tmux

zsh ユーザなので .zlogin になっていますが、bash 使いの皆さまは適宜読み替えてください。

```zsh:.zlogin
(前略)
if [[ "$SHLVL" -eq 1 && "$XDG_VTNR" -eq 1 ]]; then
    mount /mnt/vfat
    sudo loadkeys /opt/local/share/keymaps/dm200_console.map
    LANG=ja_JP.UTF-8 fbterm -- uim-fep -e tmux
fi
```

最初のコンソールのログイン直後実行時のみ、キーの再割り当てを行ったあとで、fbterm -> uim-fep -> tmux を順に立ち上げます。

こっそり、このタイミングで ```mount /mnt/vfat``` で SD カードの FAT32 領域をマウントしておきます。なお、とくに設定していませんが、一般ユーザでマウントできますね。

```text:.uim
(define default-im-name 'mozc)
(define-key generic-on-key? '("zenkaku-hankaku" "end" "F11"))
(define-key generic-off-key? '("zenkaku-hankaku" "home" "F11"))
```

全角/半角がマップされているF11でも切り替えられる他、Mac風に変換キーでON、無変換キーでOFFとなるようにしました。
（ATOK 風のキーバインドにしたいので、さらに手が入る見込みです）

```conf:.tmux.conf
set-option -g prefix C-q
unbind C-b

set-option -ag terminal-overrides ',*:U8=0'
set-option -g status-keys emacs
set-window-option -g mode-keys emacs

set-option -g status-interval 30
set-option -g status-right "|%H:%M|BATT:#(/opt/local/bin/batt)%"

bind | split-window -h
bind - split-window -v

set-option -g status-fg cyan
set-option -g status-bg black
set-window-option -g window-status-current-fg blue
set-window-option -g window-status-current-bg black
set-window-option -g window-status-current-attr bold

bind -n F12 run-shell '/opt/local/bin/sus'
#bind -n PageUp choose-window
bind -n PageDown copy-mode
bind -n Home display ''
bind -n End display ''

bind -n M-Tab next-window
```

大事なところは、後半の bind -n で直接指定している一連のショートカットです。

電源キーが割り当てられている F12 で前述のサスペンドのラッパースクリプトを呼び出します。
かなキーには適当に、copy-mode に入る機能を割り当ててみました。Home と End に割り当てているのは、uim-fep が ON の最中に ON のキーを押すと、キー入力をそのままスルーするという性質があるため、tmux 側で受け止める必要があるためです。

また、Alt+Tab で tmux の window を切り替えられるようにしてみました。

# Dropbox
Linux化の目的の一つ、Dropbox の設定です。
基本的には以下の説明ページの通り、 https://github.com/markhamilton1/Synchronator を利用します。

[KING JIM ポメラDM200単体でDropboxによる双方向自動ファイル同期ができるようにしてみた](http://hitoriblog.com/?p=52226)

違う点だけ書いておきます。

## dropbox モジュールは pip で

```
$ sudo apt install python3-pip
$ sudo pip3 install dropbox
```

## /mnt/vfat は一般権限で書き込めます

mount 関連のややこしいスクリプトは不要です。

ただ、実行はできない設定のようですので、```python3 Synchronator.py``` で起動します。

## 同期先は ~/Documents ?

実行すると ~/Documents に同期している気がします。そして、実行する度にダウンロードし直している気がします。時刻系の問題ですかね。。。

# ネットワーク（無線LAN）が遅い！！

色々インストールしようとするわけですが、時々ネットワークが妙に重くて、apt で落としてくるのも一苦労。

試しにスピードテストサイトで計測すると100kbps以下になってしまっていました。

いくら非力な DM200 とはいえ、遅すぎるということで、原因を調べてみました。

## Wi-Fi の省電力設定

ひとつ目の気になるところは、Wi-Fi の省電力設定。

DM200 にリモートから ssh 接続をすると、妙に1文字目のエコーバックが遅いと思いますが、それは、この省電力設定が原因です。

/opt/bin/wifi-switch でも明示的に `iwconfig wlan0 power off` と省電力設定を切っているはずなのですが、wpa_supplicant を呼び出して接続がされたあとに `iwconfig wlan0` を見ると、Power Managementmode:All packets received と設定が復活しています。

ざっと調べても原因は分からず。とりあえず、wpa_supplicant を呼び出してからしばらくしてから power off を呼び出すようにして様子を見ます。

ただ、この "Power Managementmode:All packets received" は、どうやら、連続通信には余り影響しないようで、LAN 内での iperf の結果はほとんど変わりません。インターネットのスピードテストでは数割程度の影響は出るようです。

## Wi-Fi の接続速度の自動設定の影響

```
$ sudo iwconfig wlan0
wlan0     IEEE 802.11  ESSID:"XXXXXXXX"  
          Mode:Master  Frequency:2.462 GHz  Access Point: XX:XX:XX:XX:XX:XX   
          Bit Rate=19.5 Mb/s   Tx-Power:32 dBm   
          Retry min limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Managementmode:All packets received
          Link Quality=5/5  Signal level=-56 dBm  Noise level=-92 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0
```

通信が妙に遅いときに確認すると、この Bit Rate という項目が、5.5 Mb/s まで下がっていることがあります。

Wi-Fi は、様々な電波環境で通信できるよう、通信状態に応じて通信速度を調整しながら通信していますが、それがほぼ最低に近いところに落ちているという状況です。

無線ドライバの中で調整してしまう値なので、法則などはよく分からないのですが、アンテナ設計が悪くて内部ノイズを多く拾っていたり、あるいはドライバの作りが悪かったりすると下がりすぎることがあるのではないかと思います。

検証中に Bit Rate が 5.5Mb/s に落ちたので、ためしに `sudo iwconfig wlan0 retry limit 4` と retry limit を減らして、iperf を UDP モードで実施してみたのですが、上りのエラーレートが50%前後でヤバい。充電ケーブルを外したところ若干下がったので、色々なところからノイズを拾っている予感がします。

5.5Mb/s というのは 802.11b の規格な気がしますので、せめて 802.11g で通信して欲しいということで以下のように設定してみました。

```
$ sudo iwconfig rate 12M fixed
```

すると、なんということでしょう。rate を上げたにもかかわらず、retry limit 4 でも、エラーレートがほぼ0%に！ 802.11g の何かが改善してくれたのでしょうね。。。

肝心の下りの速度は別のところにボトルネックがあるようなので、600kbps より上がらないのですが、上りはこれで3〜4Mbps程度出るようになります。

rate を固定してしまうと電波環境が悪いところで通信ができなくなるリスクはありますので、万人にお勧めできるわけではありませんが、rate が 5.5 Mb/s まで下がると悪いことしか起きませんので、固定するのはありかなぁ、と思います。`rate 6M fixed` にすると retry limit 1 でも数%のエラーレートという優秀さになりますので、心配な方はこちらで固定するのもありかもしれません。（2M, 5.5M, 11Mが802.11b由来のrateです)

## 結局
安定して下り 600kbps 程度を出せるようにはなったものの、ボトルネックの特定はできず。上りが4Mbps程度出ていますので、SDIO とかそういう所で詰まっているのではないとは思うのですが。。。何か情報がありましたら教えてください。

なお、iperf の UDP 受信で 600kbps が頭打ちのため、TCP の受信バッファとかそのあたりの問題ではなさそうです。また、WEP接続も試してみましたが、速度はあまり変わりませんでした。

### switch_wifi 改

```bash:/opt/bin/wifi_switch
（前略）
        echo 1 > /sys/class/rkwifi/driver

        sleep 3

        iwconfig wlan0 rate 12M fixed
        wpa_supplicant -B -iwlan0 -Dnl80211 -c${SETTING_FILE}
```

wpa_supplicant 立ち上げから十数秒後に power management が再設定されてしまいますので、power off は削除しました。

どうしても設定したい場合は sleep 15 してから power off すれば効くことは確認しています。

ただ、AP に何かの拍子に再接続した際にまた power management が設定されている様子ですので、省電力設定は素直にあきらめた方が正解かもしれませんね。

どうしても気になるならば、定期的に power off するスクリプトを cron で動かすか、あるいは、リモートから ssh 接続したり、これから大きなファイルを落とすぞ、というときに手動で省電力設定
 OFF する別スクリプトを作るかですね。

# 続き
長くなりましたので、X Window 設定に関しては別エントリに分けました。

[キーボードしかないpomera DM200でも快適X Window環境 - Qiita](https://qiita.com/alt-core/items/6b16f12ed196bcba1b58)