錯誤試行

PCや生活の試行錯誤の成果を報告するブログ

Ubuntu16.04LTSが頻繁にフリーズする(未解決)

(このエントリは不具合の報告のみで、不具合の解決には至っていないので注意)

Ubuntu16.04LTSをリリース以来使い続けて早2年近くなった。長らく快適に利用してきたが、いつからか数日に一度フリーズするようになった(Alt+PrintScreenを押しながらR->S->E->I->U->Bしても反応なく電源ボタン長押しで電源を切るしかない)。イレギュラーなものと気にせず使い続けていたところ、昨年11月頃からかその頻度が頻繁になり、年末頃から実用に支障を来す頻度でフリーズするようになってしまった。下はここ最近のフリーズ(ハング)の頻度を書き留めたものの抜粋である。時刻だけ書いてあるのはフリーズした時間。ほぼ毎日フリーズが発生している状態である。

1/10 00:30
1/13 14時頃フリーズ 就寝前に無線LANオフで放置。翌日は問題なく動作。
1/14 21:09,22:49
1/15 音楽を掛けて放置。日付けが回った24:51にフリーズ。
1/16 ハングせず。夜 音楽を掛けずネット接続のみオンラインにして放置。
1/17 4:37ハング。再起動し音楽一時停止・オンライン状態。22:28ハング 音楽掛けずネット接続もオフラインにして放置。
1/18 朝から晩まで正常動作
1/19 05:21ハング
1/20 00:54ハング
1/21 正常動作
1/22 18:18ハング(音楽・ネットon) ブートオプション変更(intel_idle.max_cstate=1)するも17:22ハング(音楽・ネットon)

肝心のハードウェア情報として、マザボASUSのH170 PRO、CPUはIntel Core i5 6500、メモリはCFD Panram DDR4 PC4-17000 CL15 8GB×2、SSDはCrucial MX200を使用している。
調べてみると、マザボ・メモリ・SSD・OSにそれぞれフリーズの原因が報告されていることが次々判明し、泥沼に嵌まり混んでしまった模様。ここからどうしたものか。Windows10+HDDを入手の上動作確認してハードウェア側の不具合かどうかの切り分けが必要になるかと思われるが、不具合切り分けのためだけに出費をするのも躊躇するものがあり保留中。

(2018/7追記)
その後の同現象発生日数は2月に19日間、3月に11日間、4月に10日間、5月に6日間、6月に5日間でだんだん減少する傾向にあり、現在のところ6/20を最後に不具合は発生していない。何度かアップデートが入ったのでそのどこかで不具合が解消されたのかもしれない。やはりUbuntu側の問題だったのだろうか?

(2023/6再追記) 解決?


その後フリーズ問題が再発。2019年頃からずっとフリーズの原因が分からず、フリーズしたらその都度電源を再投入して対応していたが、ESM⁠(Extended Security Maintenance)適用のため、カーネルを4.5.0から4.4.0に落とし、ESMでアップデートされたカーネル4.4.0を使うようにしたところ1ヶ月ほど全くフリーズせずに使えている。ESM適用後にカーネルを4.5.0に戻してみたときはフリーズが再発したので、おそらくESM版カーネル4.4.0にフリーズが改善されるアップデートが含まれていたのではないかと思われる(記事投稿時の2018年当時に使っていたカーネルのバージョンは「4.4.0-112-generic #135-Ubuntu SMP Fri Jan 19 11:48:36 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux」だった)。参考までに記しておく。

価格.comでフリーズ報告がいくつかみられる。CPU C StatesをDisableにするが変化なし。「DRAM Frequency」を固定にするが変化なし。清掃してCPUをグリスアップしても改善せず。グラボはCPU内蔵のものを使っており挿していない。

  • メモリ(CFD Panram DDR4 PC4-17000 CL15 8GB)

マザボとの相性問題の存在がamazonレビュー欄で触れられている。memtest86+では17時間問題なく稼働(Pass:7 Errors:0)

  • SSD(Crucial MX200)

製品にプチフリ問題が指摘されている。しかしディスクユーティリティのヘルスレポートやBIOSのレポートでは不具合を示すような数値は出ていない。復旧用のUSB環境でブートして放置してもハングするためSSDが原因ではない?

  • OS(・パッケージ・ドライバ)

突然のハングアップ現象が報告されている。
GRUBのオプション(intel_idle.max_cstate)を変更する方法がある模様。おそらくcpu c stateをOS側から設定する方法であると思われる。設定したが改善しない。値を0にもしてみたが変化なし。

 GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_idle.max_cstate=1"

また、フリーズ後の起動時にUbuntuに内部エラーが発生したとして「unity-settings-daemon」のクラッシュが表示されることがあったため以下のようにしてunity-settings-daemonを入れ直したが変化なし。

 sudo apt-get install --reinstall unity-settings-daemon

また、Intelグラフィックスドライバがインストールされていない場合にデフォルトで入っているドライバとの互換性がなく落ちることがあるとのこと。インストールされているかどうかはglxinfo | grep Deviceで確認できるとのことで実行してみたところ、以下のように表示され、ドライバは入っているようだった。

 Device: Mesa DRI Intel(R) HD Graphics 530 (Skylake GT2)  (0x1912)

(書き掛け)

参照サイト

(書き掛け)

RemminaでWindows10 Home+UltraVNC接続できない(解決)

Ubuntu16のリモートデスクトップクライアントであるRemmina(バージョン1.1.2)からUltraVNC(バージョン1.2.1.6)を走らせたWindows10 Homeに接続したかったが、接続するとすぐにRemminaのViewerウィンドウが閉じてしまい操作することができない。
調べてみると、UltraVNCの公式フォーラムで以下のように「最高画質を選べ」という内容が見つかる。

Re: Remmina cannot connect to computer since V1.2.0.9
Postby sergeyboev » 2016-03-15 18:44
In Remmna VNC select Best Quality.
UltraVNC • View topic - Remmina cannot connect to computer since V1.2.0.9

「高度な設定」タブの「品質」を「最高」に設定したところあっさりと接続できた。さらに別の設定についても選んでみるとデフォルト設定の「256色」以外ならどれでも問題なく接続でき、256色を指定した場合のみ不具合が再現した。
なお、RemminaにはUltraVNC用のプラグインが存在するが、これの導入は必要なくプロトコルには通常通り「VNC」を選択すればよい。

付記

synergyを稼働させていると、リモートデスクトップクライアント側のリモートデスクトップビューア内から操作のフォーカスを外せなくなり、リモートデスクトップサーバ側のOSを終了させないとリモートデスクトップクライアント側に操作を戻せなくなるので注意。
リモートデスクトップsynergyを併用するような用途はないが、リモートデスクトップ運用にする前にsynergyで使用していた際は注意。

関連サイト

ファイラーrangerでゴミ箱を使う with NTFSパーティション

CLIのファイラーrangerはファイルの削除動作を行なうと標準では(スペース選択してからなら確認は入るものの)いきなりファイルが削除されてしまうためゴミ箱機能を使えるようにしたい。trash-cli(公式GitHub)を使うことでゴミ箱機能を実現できるが、trash-cliのファイルをゴミ箱に入れるコマンドであるtrash-putをrmのエイリアスに設定しておいてもranger上で削除操作をする際には有効にならない。
rangerの削除動作をtrash-putと連携させるにはrangerの設定ファイル~/.config/ranger/rc.confを以下のように変更すればよい。

# map dD console delete
map dD shell -s trash-put %s

how to use trash-cli with ranger – code yarns

ゴミ箱の中身を見るにはtrash-listコマンドを使うが、標準だとばらばらに表示され使いにくい。ゴミ箱の中身を日付逆順にソートして表示するには以下のようにsortコマンドに渡せばよい。

trash-list | sort -k 1 -r

NTFSパーティション

ここまでは簡単だったが、ゴミ箱の中身を見ようとtrash-listコマンドを実行すると以下のように出てNTFSパーティションで削除したファイルだけが表示されない(ここではNTFSパーティションのマウント先パスを/mnt/hddとする)。trash-putしたファイル自体は/mnt/hdd/.Trash/1000に存在している。

trashdir skipped because parent not sticky: /mnt/hdd/.Trash/1000

/etc/fstabは以下の通り設定していた。

 uuid="00000DUMMY000000" /mnt/hdd     ntfs    rw,nosuid 0 0
解決方法

まず、/etc/fstabのマウントオプションに"permissons"を追加し、NTFSパーティションをマウントし直す。

 UUID="00000DUMMY000000" /mnt/hdd     ntfs    rw,permissions,nosuid 0 0
 # ↑オプションに"permissons"を増やしただけ

次に、.Trashディレクトリにスティッキービットを設定するとともに、.Trash以下のオーナーをログインIDに変更すればよい(以下の例ではログインIDをhogeとしている)。

 sudo chmod 1777 /mnt/hdd/.Trash/
 sudo chown -R hoge:hoge /mnt/hdd/.Trash/
試行錯誤の記録

ここからは解決に至るまでの試行錯誤の内容。なお、解決に要した時間は3時間だった。

調べてみると、trash-cli公式GitHubのIssue(Problem using Trash on a usb key · Issue #59 · andreafrancia/trash-cli)にてtrash-cliは.Trashディレクトリにスティッキービットが立っていることが必要だが、NTFSパーティションはスティッキービットを立てられないとの内容が見付かった。他のIssueでも作者が以下のようにスティッキービットを立てられないファイルシステムはサポートしていないとコメントしている。

andreafrancia commented on 2 Jan
trash-cli does not support filesystem that does not allow to set the sticky bit.
trash-empty not working for partitions · Issue #65 · andreafrancia/trash-cli

何とかならないかと探していたところTuxera Support - View topic - Cannot mount NTFS with the Sticky bitntfs-3g を使って NTFS に書き込む - ぽち*ぷ〜ちにてntfs-3gコマンドの存在を知る。ただし、毎回ntfs-3gコマンドを実行してマウントするのは実用的ではないのでfstabに記述する方法を調べた。
fstabに記述するには以下のようにntfsの代わりにntfs-3gを指定しオプションにpermissionsを指定すれば良いようだ。

 UUID="00000DUMMY000000" /mnt/hdd     ntfs-3g    rw,permissions,nosuid 0 0

permissions - How do I correctly mount a NTFS partition in /etc/fstab? - Ask Ubuntu

これでNTFSパーティションディレクトリでも以下のようにスティッキービットが立つ。

 chmod 1777 /mnt/hdd/.Trash
 ls -ld /mnt/hdd/.Trash
 drwxrwxrwt 1 root root 0 11 10:10 /mnt/hdd/.Trash

これで良いかと思われたが、実際にNTFSパーティションのファイルを削除すると以下のようにファイルがゴミ箱に移動できない旨のエラーが出る。

trash-put hoge
trash-put: cannot trash regular file 'hoge'

そこで、.Trashディレクトリ以下全てのディレクトリをログインユーザ(以下の例ではhoge)の所有にしてみたところうまくいき、trash-listでNTFSパーティションのファイルも表示されるようになった。

 sudo chown -R hoge:hoge /mnt/hdd/.Trash/

さらに調べるとUbuntu 16.04でntfsntfs-3gへのシンボリックリンクになったとのこと。

Re: NTFS or NTFS-3G
Just ran this in Ubuntu 16.04 in case something changed:
tester@vub1604:~$ ls -l /sbin/mount.ntfs
lrwxrwxrwx 1 root root 13 Apr 23 18:14 /sbin/mount.ntfs -> mount.ntfs-3g
It would appear that "ntfs" is still a symbolic link to "ntfs-3g".
[SOLVED] NTFS or NTFS-3G

そこで以下のように/etc/fstabの"ntfs-3g"を"ntfs"に変えてマウントし直してみたところスティッキービットは立っていた。結局マウントオプションの「permissions」の有無だけがキモだった模様。

 UUID="00000DUMMY000000" /mnt/hdd     ntfs    rw,permissions,nosuid 0 0

マウントオプションのpermissionsについてはmountコマンドのマニュアルを見ても掲載が無く、検索してもこれと言った情報が出て来なかった。

参照サイト

trash-cli公式GitHub。FAQにtrash-putをrmのエイリアスにするべきではないと書いてある。

trash-cliパッケージのコマンド一覧が掲載されている。現在はややコマンド名が異なっており以下のようになっている。

コマンド名 機能
trash(trash-put) ファイルを削除する
trash-list ゴミ箱の中身を見る
restore-trash ゴミ箱からファイルを復元する
trash-empty ゴミ箱を空にする
trash-rm 指定した日数以前のファイルをゴミ箱から削除する

fstabでpermissionsオプションを設定したが、マウント後にmtabを見るとオプション設定がdefault_permissionに上書きされているのはなぜか?という質問。mountオプションのpermissionについての記述がある。permissionオプションが何か?についての記載はない。

NTFSパーティションをマウントするとrootの所有となりパーミッションが777になってしまうが正しく設定する方法はあるか?という質問。mountオプションのpermissionについて以下のようにpermissionオプションを付けるとchmodやchownが動作するとの回答がある。permissionオプションが何か?についての記載はない。

answered Panther Mar 17 '12 at 15:24
If you mount the ntfs partition with the permissions option, then chmod / chown will work
/dev/sda2 /mnt/excess ntfs-3g permissions,locale=en_US.utf8 0 2

answered CMP Aug 3 '15 at 3:19
UUID=xxxxxxxxxxxxxxxxx /media/mydrivename ntfs permissions,locale=en_US.utf8 0 2

Android上のEmacsでミニマムテープ起こし環境を整える

ひとまずのメモ書き。

Termuxでmpvをインストールする。Termuxについては以下の前回の記事を参照。

以下の記事を参照してmpv.elを入れて設定する。後は使い方まで含めて記事中に全て書いてあるのでそちらを見ればよいのだが、Termuxという環境での設定記録として若干のカスタマイズと補足を書いた。

Termuxにはmozcが無いのでskkAndroidIMEを利用する。ただしAndroidIMEは最下段に表示され変換を確定するまでEmacsに反映されないのでやや使い勝手が良くない。

  • ショートカットを変更

以下のようにショートカットを変更した。本来はC-M-kのように設定したかったが、ターミナル上では「C-」の組み合わせが特定のキーしか有効にならない*1ため。

ショートカットキー 機能
M-k 再生/一時停止
M-, 少し戻る
M-. 少し進む

mpv.elの以下の箇所のキー設定を変更する。

(global-set-key (kbd "M-k") 'mpv-pause)
(global-set-key (kbd "M-,") 'mpv-seek-backward)
(global-set-key (kbd "M-.") 'mpv-seek-forward)

なお、リンク先記事のmpv.elのコードに記載されている「H-」とはHyper(Windowsキー)のことだが、BluetoothキーボードのWinキーを押しても反応しなかった(ターミナルなので当然か)。

  • 再生

M-x mpv-play→ファイルを選ぶ

  • リンクの挿入

「C-c C-l」→「Link:」が表示される→「mpv」を入力→音声ファイルをフルパス指定→RET RETでリンクが挿入される。リンクの上で「C-c C-o」すると再生が開始できる。Termux上のEmacs24という環境のためか、音声ファイルを指定する際にはミニバッファに(no completion)と表示されておりファイル名の補完機能は効かなかった。

  • 再生位置の挿入

「C-c C-x -」すると再生時刻が挿入される。挿入された時刻の上で「C-c C-o」するとその位置へ飛ぶ。本来は「M-RET」で挿入されるはずだが、Termux上のEmacs24という環境のためか挿入されなかった。

  • これはできないか?

モードラインへの再生時間表示。標準であっても良さそうな機能だが、現在の再生時刻を確認するには「C-c C-x -」して知るしかない。

  • GNURoot Debianではどうか?

Termuxとは別のターミナルアプリ「GNURoot Debian(Google Play)」にはTermuxにはないemacs-mozcパッケージが存在するためGNURoot Debianでのテープ起こしを考えたが、GNURoot Debianにはmpvパッケージが存在するものの以下のエラーが出てmpvが実行できなかった。

mpv: error while loading shared libraries: libx264.so.142: cannot enable executable stack as shared object requres; Permission denied
  • まとめ

基本的にシングルタスク・シングルウィンドウのAndroid端末では、単体でテープ起こしをすることは不可能だったが、Termux+Emacs+mpv.elの導入により、AndroidBluetoothキーボード*2(とできればカナル型イヤフォン)さえあればいつでもどこでもEmacsによるミニマムな快適テープ起こし環境が可能となった。記事中のリンク先をはじめとした先人に感謝したい。

Android上でpukiwikiを稼働させる

PCにpukiwikiというWikipedia(を動かしているソフト)の親戚のようなソフトを入れて、個人的なメモ書きとして使用している。そこで、スマホでこのメモ書きをいつでもどこでも持ち歩いて見られたら大変便利だと思い立ち、Android上でpukiwikiを稼働できるかどうか調べてみた。
すると、KSWEB(Google Play)というアプリ(2.99ドル:5日間試用可)をインストールすると、簡単にpukiwikiの稼働に必要な環境が実現できることが分かった*1
結論として、pukiwikiを正常に動作させるためにはKSWEBのPHPバージョンは5.6.12を指定し、pukiwikiは1.5.0を使えばよいと分かった(Androidバージョン6.0にて動作確認)。以下に詳しい内容を記す。

(2019/1追記)
2019/1現在のKSWEB3.93はPHPのバージョンが7.2.3で、pukiwikiはやはりエラーが出て動かない(pukiwiki1.5.0にて確認)。KSWEBの設定画面でPHPのタブから「PHP Version」の右脇の「7.2.3」をタップすると、「External Pack」のダウンロードリンクがあるのでタップしてダウンロードの上、「+」ボタンから落としたファイルを指定する。するとPHPのバージョンを選べるようになるので、バージョン5.6.31を選択した上でKSWEBを一旦終了させて再度起動すると正常に動くようになる(Androidバージョン8.0にて動作確認)。

pukiwikiの最新のバージョンは記事作成時点(2017/9)で1.5.1だが、記事作成時点のKSWEBの最新バージョンである3.7.3(PHPバージョン7.1.5)でEUC-JP版のpukiwiki1.5.1を動かしたところエラーが出てページが表示されない(個別ページを表示しようとするとattach.inc.php内でT_STRING関連のエラーが発生した旨が表示される)。
手元のPCのPHPバージョン7.0.22の環境下ではEUC-JP版のpukiwiki1.5.1が正常に動作しているため、PHPのバージョンアップにより不具合が生じている可能性が考えられた(ただしpukiwiki公式サイト(回答の項目の一番下)ではPHP7.1への対応が明記されているので、また別の原因かもしれない)。
そこでPHPバージョンが5.6.12であるKSWEBバージョン3.4でpukiwiki1.5.1を動作させてみるが、今度はリンクがうまく処理されず、「最終更新」ページで更新されたページへのリンクがブラケットに囲まれて表示されたり、個別ページでリンク文字列を設定したリンクがURLしか表示されていなかったりする。ならばとpukiwikiをバージョン1.5.0に差し替えたところ、不具合は改善し正常な動作を確認できた。

KSWEBではMySQLも動作させることができるので、WordPressも動くと思われるので機会があれば試してみたい(Google Playのレビューコメントでは動作しているとのこと)。

参照サイト

*1:webサーバであるlighttpdPHPの他、MySQLやNginx,Apache,FTPサーバ機能なども用意されている。なお、KSWEBの他にもPHPが動くウェブサーバ機能を提供するアプリはあるようで、無料でもPHPが動くアプリがあるかもしれないし、Termuxでサーバ環境を用意することも可能かもしれないが未確認

AndroidでEmacsが動くなんて素敵すぎる!(非Root環境)


ガジェットブログの有名サイト「ひとりぶろぐ」に以下のエントリがあった。

そのブコメによると、Android上でDebianが動くという。

KING JIM ポメラDM200でEmacs、Vim、Ruby、Pythonが動くなんて素敵すぎる!

昔の戦友を見ているみたいで胸が熱く、軽量な筐体と質の良いキーボードはうらやましい。しかし実用的にはDebian on Android+bluetoouhキーボードのほうがRAMも多いし快適かな。T699とかなら立ったままコーディングも可能。

2017/07/16 09:14

早速検索してみると、以下の記事が見つかったので真似してみた末にターミナル環境でEmacsが実用的に動くようになったので以下にそのメモ書きを残す。

AndroidでLinux!root化不要でAndroid上にGNU/Linux環境を構築する方法 – OTTAN.XYZ(消滅)
(追記)残念ながらページが消えてしまっていた。またGNURoot Debianは開発終了してしまったらしく、以下のアプリへの移行が案内されていた。後日検証してみたい。

(2017/10/21 追記)
同じくAndroidのターミナルアプリであるTermuxでは記事本文で挙げた日本語フォントの表示不具合が無いのでTermuxの利用をおすすめする(Termuxのリポジトリにmozcパッケージが存在しないのだけが残念だが)。
以下リンク先の記事でTermux上でのEmacs使用方法が紹介されている。
Android上でEmacsをまともに使うには | mhatta's mumbo jumbo
(2017/10/29 さらなる追記:簡単な使用メモとノウハウ)
フォントの拡大縮小はまさかのピンチ動作で可能。
画面左端をスワイプでメニューが出る。メニューでは仮想ターミナルの一覧表示と新たな仮想ターミナルを増やすことができ(キーボードからCtrl-Alt-Cでも可能)、キーボードからCtrl-Alt-Nを押すと次の仮想ターミナルへ移動することができる。
ターミナルのその他のショートカットキーは以下。

ショートカットキー 機能
C-A-P 前の仮想ターミナルへ移動
C-A-数字 指定した番号の仮想ターミナルを開く
C-A-+(プラス) フォントサイズを大きくする
C-A--(マイナス) フォントサイズを小さくする
C-A-M 右クリックメニューのようなものを出す
C-A-F フルスクリーン
C-A-R 現在の仮想ターミナルにセッション名を付ける
C-A-U ターミナルに表示されているURLを抽出してコピーもしくは開く
C-A-→ 仮想ターミナル(セッション)一覧を表示
C-A-← 仮想ターミナル(セッション)一覧を閉じる

現在の仮想ターミナルを閉じるにはC-A-Mからkill processする。
テキストを編集する際に端末からemacsclientするにはemacsでM-x server-startしておいて、別の仮想ターミナルからemacsclientを実行し、C-A-Nでemacsの仮想ターミナルへ移動すればよい。
余談だが、併せてPC-Android間でファイルの同期ができるadb-sync(google/adb-sync)の導入をお勧めしたい。Dropboxなどのクラウドストレージを利用してもよいが、クラウドに上げたくない私的な・内部的なファイルでは使いにくいのと、サイズの大きいファイルでもスピーディーに同期できる点でadb-syncが優れている。adb-syncコマンドはるびきちメルマガ(Emacsの鬼るびきちのココだけの話)より知った。大変便利。



導入方法

上の記事の通りGoogle Playから「GNURoot Debian」をインストールし、記事の説明の手順を終えた後にemacs24をインストールする。GUI環境が必要なら記事に紹介されているように「XServer XSDL」をインストールするが、手元の端末ではGUI環境は動作が重く操作もしにくいため動作確認を行なったのみで詳しい使い勝手は調べていない。
Debianのシステムは/sdcard/GNURoot以下にディレクトリが展開されている模様。

日本語表示

デフォルトだとターミナルで日本語は文字化けして表示されない。このためターミナルからemacs -nwコマンドで起動する端末emacs上でも日本語は文字化けする。これはGNURoot Debianの右上メニュー→設定→「デフォルトでUTF-8」をチェックすればよい。また~/.bashrcに以下を記載しておく。

export LANG="ja_JP.UTF-8"
export LANGUAGE="ja"

第256回 新春特別企画・Android上でUbuntu…ではなくDebianを使う:Ubuntu Weekly Recipe|gihyo.jp … 技術評論社

フォント表示

設定メニュー→テキスト→フォントサイズでフォントの大きさを変更できる。Emacsでの入力時に読みやすくするには20ポイントぐらいに設定する。.emacsでフォントを変更しても適用されないようだ。現在のAndroidスマートフォンで一般的な大きさである6インチ弱の端末の場合、ウインドウを分割するなら16ポイントが良い。端末は通常横向きで使用すると思われるが、20ポイントだと上下にウインドウを分割した際に各ウィンドウが2行ぐらいしか表示されない。

日本語入力

ddskkをインストールするとEmacsskkによる日本語入力が可能となるが、漢字変換をしてskk辞書を学習させているとEmacsの終了時にモードラインに「cannot set file date」と出て終了できない(Androidシステム上でのファイルパーミッション設定(変更不能)が原因か)。
仕方が無いのでCtrl+Shift+Nで別ウィンドウを作成しemacsプロセスを強制終了させることで対処する(.skk-jisyoは正常に保存されている模様)。別の端末ウィンドウに移動するごとにAndroidの日本語入力がオンになってしまい、コマンドを入力するには漢字変換キーを2回押ししなければならないのは煩わしいところ。


SKKによる日本語入力の様子。1行目と5行目で漢字変換により画面描画が乱れ入力位置直前の1文字が消えてしまっている。Ctrl-lで画面を再描画することで正しく表示されるが煩わしい。

  • Mozcの利用

以上に挙げたSKK利用による不具合を回避すべく、代替案としてmozcを利用しようとemacs-mozcパッケージをインストールしてみる。C-\でmozcが起動でき快適に入力ができる。


Mozcによる日本語入力の様子。三点リーダ(…)の箇所で画面描画が乱れ三点リーダの直後にアンダースコアが入って見えるが、アンダースコアを消そうとすると実際には三点リーダが削除されてしまう。この他、長い文章を入力した際に長い変換候補の表示によって画面描画の乱れが発生し、カーソル位置と思っている箇所への文字入力や文字削除が位置ずれして反映されてしまうこともあり煩わしい。

ただ予測候補への変更でTabやC-iを押すとカタカナに代わってしまい予測変換ができない。GUI上のEmacsだと正常にTabで選択できたのでコンソールだけダメである模様。色々と試行錯誤したが上手く行かず諦めた。また上記に挙げた予測候補が表示されるときに画面が乱れ、カーソル位置が入力位置と異なる位置に移動したかのように見える不具合については、mozc-popupというmozcの予測候補の表示方法を変更するパッケージがあり、それを利用すると改善するとの情報があった。試行錯誤した内容とmozc-popupの設定については以下の囲みを参照。

  • 試行錯誤

JapaneseEnvironment/Mozc - Debian Wikiによると、mozc-utils-guiからキーバインドを変更できるとのことだがGUI環境でmozc設定ツールを起動してもウィンドウは表示されるものの設定項目の内容が表示されない。
emacs-mozc を動かすための設定(emacs 設定編) - NTEmacs @ ウィキ - アットウィキの「8) (「サーバ準備編」利用の場合) mozc のキーバインドを設定する。」 にて他のOSの設定を~/.mozc ディレクトリにコピーすればよいとされているが、その通り実行しても設定が適用されない。

  • mozc-popupの設定

mozc-popupを入れるためのパッケージシステムの設定はbind-key.el : define-keyを直接書くのは時代遅れ!Emacsの重鎮が行っているスタイリッシュキー割り当て管理術!- るびきち「新生日刊Emacs」の説明を参照。これを設定してmozc-popupを入れてみたが「Tabキーで選択」という候補選択の案内表示はされるもののTabを押してもカタカナになってしまうのは変わらず。しかし画面の乱れは無くなり快適な日本語入力が可能となった。ただ、そもそもAndroidIMEを使えば予測変換は可能なので、場合によってはAndroidIMEを使って入力した方が楽かもしれない。

mozc-popupによる日本語入力の様子。画面描画が乱れることなく入力ができる。

キー入力

  • メタキー(M-)の有効化

メタキー(M-)を有効にするためGNURoot Debianの右上メニュー→設定→「ALTキーでESCを送出」にチェックを入れる。

  • マーク(C-SPC)が利かない問題の対応

マーク(C-SPC:set-mark-command)が効かない問題がある。.emacsのglobal-set-keyで「C-\ 」のように記述してもダメ。以下のリンク先でコメントされているように、ターミナルの種類によってCtrl+スペースおよびアスタリスクの組み合わせがキーコードとして動作しない模様。

If you're running Emacs in a terminal, then C-SPC and C-8 are unlikely to send what you want them to.
windows 8 - Why can't I set mark on emacs? - Stack Overflow

I tried setting set-mark-command to Ctrl-x-g which fixes the problem
emacs Ctrl-SPC default mark key-binding not working · Issue #583 · Microsoft/BashOnWindows · GitHub

対策として、~/.emacsでマーク(C-SPC:set-mark-command)を以下のようにAlt+@の組み合わせに変更したところ動作した(本来ならより近いキーバインドであるAlt-Spaceを使いたかったが、Alt-SpaceはAndroild上でIMEのオン/オフにバインドされているため)。

(global-set-kay [?\M-@] 'set-mark-command)

所感

いつでもどこでも手元のスマホEmacs環境があるのは素晴らしい。
後はunisonによるPCとのファイル同期ができれば完璧だが、unison自体はインストールできるものの、AndroidでRoot権限を取得しないとファイルのパーミッションを変更できないことからunisonでの同期時にエラーが出てしまう(sshでの公開鍵パスフレーズなしログインも~/.sshやauthorized_keysファイルのパーミッションを適切に設定できないためか不可能)*1。unisonの実行時に-ignorelocksオプション(Reference Guide / Preferences - Unison File Synchronizer / User Manual and Reference Guide)を付ければエラーは回避可能だが、編集したファイルの同期に不具合が出る可能性がある以上、実用には不安が残る。Androidがユーザー領域のファイルについては非Root環境でもパーミッションの変更を認めてくれればよいのだが…。
(追記)

何度か試してみたところPC→Androidへの同期は問題無く行なわれるが、逆方向であるAndroid→PCへの同期にてOcamlのバージョンが異なる旨のエラーが表示されて同期できなかった(PCとAndroidでUnisonのバージョンはマイナーバージョン番号まで一致している)。これを解決するにはPC側でAndroidのUnisonのコンパイルに使われたのと同じバージョンのOcamlをビルド・インストールしてUnisonをビルドすることになる(あるいはAndroidをRoot化してPCと同じバージョンのOcamlをビルド・インストールしてUnisonをビルドするか)。既にデスクトップPCでは他のノートPCとのUnison同期を行なっているため、しばらく先の課題としたい。

その他

  • org-modeの見出しを見やすい色にする

デフォルトだとorg-modeでトップレベルの見出しの色が見えにくい。~/.emacsに以下を追記すれば黄色になる。

(custom-theme-set-faces 'user `(org-level-1 ((t (:foreground "yellow")))))

themes - customize colors of level in org-mode - Emacs Stack Exchange

  • 端末へのペースト

ターミナルの画面を長押しするとテキスト編集ダイアログが出てクリップボードの中身を貼り付けられる。

  • GUI環境ではAlt+Tabでの切り替えができない

GUI環境ではAlt+Tabでの切り替えがAndroidのアプリ切り替えに取られてタスク切り替えができず、極小のカーソルを画面タッチで動かしてウィンドウを切り替えしなければならず、複数アプリを切り替えての使用には実用上難点がある。Bluetoothマウスを使用するかホットキーによるタスクスイッチを設定すれば良いのかもしれない。

  • Vysor経由時はCtrlが入力できない

PCからAndroidを操作できるVysorを使用した場合にCtrlが入力できない問題がある。Bluetoothキーボードからなら問題なくCtrlが入力できる。

Google Playで配布されているEmacsアプリ。存在は知っていたがレビューの評価が良くないのと更新が止まったままのようなので試していない。最終アップデートは2012年8月23日となっている。

android debain」で検索するとまずヒットしてくるアプリだが、以下のアプリ説明文の通り、手元の端末のAndroid 6.0には対応していなかった(アプリ制作者が新しいスマートフォンを購入するまではアップデートの予定が無い模様)。

Android 6.0 Marshmallow is not supported!

本家Emacswiki。最初の項目にTermuxが書いてあった。

*1:sshpassコマンドを使うことでパスワード入力を省略することが可能。sshpass -p password unison hoge.prfのように記述する sshコマンドでパスワードをオプションとして入力出来るようにする『sshpass』 | 俺的備忘録 〜なんかいろいろ〜

xyzzyのbuffer-opposite(現在のバッファを反対側のウィンドウにも表示)をEmacsでも使う

WindowsEmacsenであるxyzzylispで「現在のバッファを(表示位置もそのままに)分割した反対側のウィンドウにも表示する」というコードをどこかで拾ったが、これが「現在の表示位置をそのままにして文書の別のところを見に行きたい」という際に通常だとウィンドウが分割されている場合「C-x 1 C-x 2」とする必要があるところを簡単に切り替えができて便利なためEmacsでも使えないかと常々思ってきた。ある時久し振りにxyzzyを使う機会があったため、試しにxyzzyの設定ファイルであるsiteinit.lからコードをコピーして.emacsにペーストしたところ問題なく動作した。どこかで拾ったこのコードはbuffer-oppositeで検索しても見つからないためここで共有しておきたいと思う。
elispは知らないが、改めて見てみるとやっていることは他のウィンドウを消してウィンドウを分割するというシンプルな内容のようだ。以下ではC-c bをキーバインドに設定している。

;; buffer-opposite 現在のバッファを分割した反対側のウィンドウにも表示する
(defun buffer-opposite()
  (interactive)
  (delete-other-windows)
 (split-window))
(global-set-key (kbd "C-c b") ' buffer-opposite) ;キーバインドをC-c bとする

以下は実際の操作画面。emacs-w3m日本語版のinfo画面を表示した状態からC-c bでウィンドウを2分割させ、別ウィンドウに移動してスクロールさせた後にC-c bで元のウィンドウに同じ位置を表示させている。