【何を】screenコマンドで表示が崩れる問題【今更】

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/2e2e05db-2567-fba3-eb53-d843b96bee6c.png" width=80%>

## 現象

`screen`コマンドで開始したセッション上で `alsamixer` を実行すると表示が崩れることに最近気が付いた。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254888/f4c38f64-8115-b049-db85-47e9a07c6e2c.png" width=80%>

取り合えず矢印キーでの音量設定はできるので構わず使っていたが、流石に気持ち悪いので調べてみた。

## 対応方法

`~/.screenrc` に（無ければ作成）以下追記

```shell
cjkwidth off
```
参考URL：
[bug #46273: screen 4.3.1 broken nmon's display and alsamixer](http://savannah.gnu.org/bugs/?46273 "GNU Screen - Bugs_ bug #46273, screen 4.3.1 broken nmon's display... [Savannah]")
> try adding "cjkwidth off" to your ~/.screenrc and it will probably work again.

`cjk` の意味は以下参照。
[CJK統合漢字 - Wikipedia](https://ja.wikipedia.org/wiki/CJK%E7%B5%B1%E5%90%88%E6%BC%A2%E5%AD%97 "CJK統合漢字 - Wikipedia")
> CJK統合漢字の名称は、中国語(Chinese)、日本語(Japanese)、朝鮮語(Korean) で使われている漢字をひとまとめにしたことからきている。

所謂全角文字って認識でいいのかな。どうもその文字幅設定機能に問題があるので `off` にしろってことらしい。

## 御託

そもそも、`alsamixer` は `ncurses` を利用している。
[alsamixer(1) - Linux man page](https://linux.die.net/man/1/alsamixer "alsamixer(1) - Linux man page")
> alsamixer - soundcard mixer for ALSA soundcard driver, with **ncurses** interface

`ncurses` は以下参照。
[ncurses - Wikipedia](https://ja.wikipedia.org/wiki/Ncurses#:~:text=ncurses%20%E3%81%AF%E3%80%81%E7%AB%AF%E6%9C%AB%E3%81%AB%E4%BE%9D%E5%AD%98,%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82 "ncurses - Wikipedia")
> ncurses は、端末に依存しない形式でテキストユーザインタフェース (TUI) を作成するためのAPIを提供するライブラリ。画面切り替えを最適化し、リモートシェルで使ってもレイテンシを最小に抑えるようになっている。

根源的には、`screen`コマンド + `ncurses` の問題。（`alsamixer` 云々ではなく）
経緯としては、GNU Screen 4.x 辺りのパッチに問題があり、表示に不具合が発生するようになったらしい。

[UTF8環境のGNU Screen 4.1_4.2でNCursesの表示がおかしくなる - Narrow Escape](https://www.hiroom2.com/2015/05/29/utf8%E7%92%B0%E5%A2%83%E3%81%AEgnu-screen-4-1-4-2%E3%81%A7ncurses%E3%81%AE%E8%A1%A8%E7%A4%BA%E3%81%8C%E3%81%8A%E3%81%8B%E3%81%97%E3%81%8F%E3%81%AA%E3%82%8B/ "UTF8環境のGNU Screen 4.1_4.2でNCursesの表示がおかしくなる - Narrow Escape")
[GNU Screen 4.2.0にしたら罫線表示がぶっ壊れた](https://anond.hatelabo.jp/20140512183601 "GNU Screen 4.2.0にしたら罫線表示がぶっ壊れた")
[GNU screenの日本語環境でncursesを使うと表示が乱れる - ksaitoの日記](https://ksaito11.hatenablog.com/entry/2016/12/12/123430 "GNU screenの日本語環境でncursesを使うと表示が乱れる - ksaitoの日記")
[Unicode の曖昧な文字幅問題 その2 - diary of a madman](https://macks.hatenadiary.org/entry/20061001/p1 "Unicode の曖昧な文字幅問題 その2 - diary of a madman")
[GNU screen](https://cympfh.cc/memo/screen.html "GNU screen")

っていうかバグだよね、これ。`cjkwidth` 機能を `off` にすることによる問題回避は小手先の対応に過ぎない。根本的な修正を望みたいところ。
英語圏にも日本人以上に日本語、文字コードレベルで詳しい方もいて驚かされる。

[海外の技術者が日本語の「文字化け」を本気で解説、日本人顔負けの日本通っぷりが披露される - GIGAZINE](https://gigazine.net/news/20211102-mojibake-field-guide-japanese/ "海外の技術者が日本語の「文字化け」を本気で解説、日本人顔負けの日本通っぷりが披露される - GIGAZINE")

しかし、Linux の世界では非英語圏は蚊帳の外というか、あまり熱心に対応してくれないよな。ぶっちゃけ、物凄くどうでもいいです、ぐらいな感じだろうし。
とはいえ今回色々と調べていて良い勉強になった。
個人的に `screen`コマンドは常用しているが、セッションの作成に限定した単純な使い方だけだった。（無線LAN がよく切れるのでその対策）
奥が深いツールなのでもう少し勉強して使い込んでいきたいと思ったなり。

[Man page of SCREEN](https://linuxjm.osdn.jp/html/GNU_screen/man1/screen.1.html "Man page of SCREEN")
[Screen User’s Manual](https://www.gnu.org/software/screen/manual/screen.html "Screen User’s Manual")