ラベル Ubuntu の投稿を表示しています。 すべての投稿を表示
ラベル Ubuntu の投稿を表示しています。 すべての投稿を表示

2025年3月30日日曜日

記号的な、アイコン的なフォント

80年代にパソコンで漢字が使えるようになると、漢字に加えてギリシャ文字やキリル文字なども使えるようになった。
文字だけでなく、例えば、郵便マークの「〒」などの記号も色々使えるようになった。
これは日本語文字セットの中に限っての話だったのだが、Unicodeが使われるようになって、世界中で様々な記号が共通して使えるようになった。

記号を効果的に使えば、表現力が上がる。

色々調べた事を文書にして残している。
grepなどで検索しやすくするため、それらの多くはプレーンテキスト(UTF-8だけど)で書いている。
めったに無いのだが、ときどきLibreOffice Writerで清書して、pdfファイルにすることがある。

過去そんな風にして書いた.odt文書をVirtualBox内のUbuntuで編集しようとしたら、丸に小文字の'i'と入った文字が、変なグリフになってしまった。
本来のグリフ。丸に'i'の文字。
変なグリフ。なぜか花束。
端末にコピペして表示しても同じようになる。
すなわち、表のUbuntuでは「丸に'i'」だけど、VirtualBox内では「花束」になる。

調べていくと、この文字は awesomeフォント のグリフで、VirtualBox内のUbuntuではまだinstallしていなかった。
インストールすると、表示できるようになる。
以下のようにして、awesomeフォントをインストールする。
$ sudo apt install fonts-font-awesome
このフォントは海外では開発者用のフォントとして使われるようだ。
プレーンテキストでも使えるので、ソースコード内のコメントでも使えなくもない。
ただしこのawesomeの「丸に'i'」= U+F05A は、Private Use Area なので、誰もが使えるわけではない。
みんなで扱うソースコード内での使用は、少し考えたほうが良いだろう。
('ⓘ' = U+24D8を使うとか)

2024年6月23日日曜日

EditorConfig

Ubuntu24.04をVirtualBoxで試している。
更新のたびに画面を構成する部品ががきれいになり洗練されていく。

テキストエディタもGTK-4系に移行し、画面右に"Overview map"(概略表示のようなもの)が表示できるようになり、モダンな感じになった。
スペルチェックもあり、自分の英語のスペルミスの多さに閉口する。
贅沢な感じもするが、これが今風なのだろう。

設定画面を見ているときに、"Discover Document Settings" 「ModelineやEditorConfigなどを使用して設定を適用します」などというのがある。
EditorConfig? なんだこれ?

調べてみると、様々なテキストエディタや統合環境間で、コーディングスタイルを統一するための仕組みのようだ。
例えばタブサイズや改行文字の設定を、エディタが違っても、プロジェクト全体で統一する。
対応しているエディタは、カレントワーキングディレクトリまたはその上位ディレクトリにある".editorconfig"と名付けられたファイルを探し、その設定を取り込む。
プロジェクトファイルにこの.editorconfigを加えて、みんなで共有することで、プロジェクトでのコーディングスタイルを管理する。
そんな仕組みがあるとは知らなかった。すっかり原始人だな。

Ubuntu24.04、4月の段階ではフリーズしまくりでほとんど使い物にならなかった。
少しずつ良くなってきているが、個人的には時期尚早と思う。
のんびりしているので、原始人化してしまうんだろうな。

2024年1月12日金曜日

VirtualBox 7.0 on Ubuntu 22.04 + Linux 6.5.0

いつものようにVirtualBoxをUbuntu22.04上で動かそうとしたら動作しない。
コマンドラインから起動しようとすると以下のようなメッセージが表示される。
$ WARNING: The vboxdrv kernel module is not loaded. Either there is no module
         available for the current kernel (6.5.0-14-generic) or it failed to
         load. Please recompile the kernel module and install it by

           sudo /sbin/vboxconfig

         You will not be able to start VMs until this problem is fixed.
カーネルモジュールがロードできないようだ。
そういえば、先日カーネルの更新があった。それが関連しているのかな?
"sudo /sbin/vboxconfig"で、カーネルモジュールを再コンパイルしてインストールせよと書いてあるのでやってみたら、
$ sudo /sbin/vboxconfig 
[sudo] shin のパスワード: 
vboxdrv.sh: Stopping VirtualBox services.
depmod: WARNING: could not open modules.order at /lib/modules/6.2.0-37-generic: No such file or directory
depmod: WARNING: could not open modules.builtin at /lib/modules/6.2.0-37-generic: No such file or directory
vboxdrv.sh: Starting VirtualBox services.
vboxdrv.sh: Building VirtualBox kernel modules.
vboxdrv.sh: failed: Look at /var/log/vbox-setup.log to find out what went wrong.

There were problems setting up VirtualBox.  To re-start the set-up process, run
  /sbin/vboxconfig
as root.  If your system is using EFI Secure Boot you may need to sign the
kernel modules (vboxdrv, vboxnetflt, vboxnetadp, vboxpci) before you can load
them. Please see your Linux system's documentation for more information.
失敗した。
何が間違っているかを見つけるために、"/var/log/vbox-setup.log"を参照せよとある。
見てみると、
$ cat /var/log/vbox-setup.log
Building the main VirtualBox module.
Error building the module:
make V=1 CONFIG_MODULE_SIG= CONFIG_MODULE_SIG_ALL= -C /lib/modules/6.5.0-14-generic/build M=/tmp/vbox.0 SRCROOT=/tmp/vbox.0 -j8 modules
make[1]: 警告: 副次 make で -j8 を強制指定しました: jobserver モードをリセットします.
warning: the compiler differs from the one used to build the kernel
  The kernel was built by: x86_64-linux-gnu-gcc-12 (Ubuntu 12.3.0-1ubuntu1~22.04) 12.3.0
  You are using:           
make -f ./scripts/Makefile.build obj=/tmp/vbox.0 need-builtin=1 need-modorder=1 
# cmd_mod /tmp/vbox.0/vboxdrv.mod
  printf '%s
'   linux/SUPDrv-linux.o SUPDrv.o SUPDrvGip.o SUPDrvSem.o SUPDrvTracer.o SUPLibAll.o common/string/strformatrt.o combined-agnostic1.o combined-agnostic2.o combined-os-specific.o | awk '!x[$0]++ { print("/tmp/vbox.0/"$0) }' > /tmp/vbox.0/vboxdrv.mod
# CC [M]  /tmp/vbox.0/linux/SUPDrv-linux.o
  gcc-12 -Wp,-MMD,/tmp/vbox.0/linux/.SUPDrv-linux.o.d -nostdinc -I./arch/x86/include -I./arch/x86/include/generated  -I./include -I./arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I./include/uapi -I./include/generated/uapi -include ./include/linux/compiler-version.h -include ./include/linux/kconfig.h -I./ubuntu/include -include ./include/linux/compiler_types.h -D__KERNEL__ -std=gnu11 -fshort-wchar -funsigned-char -fno-common -fno-PIE -fno-strict-aliasing -Wall -Wundef -Werror=implicit-function-declaration -Werror=implicit-int -Werror=return-type -Werror=strict-prototypes -Wno-format-security -Wno-trigraphs -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx -m64 -mno-80387 -mtune=generic -mno-red-zone -mcmodel=kernel -Wno-sign-compare -fno-asynchronous-unwind-tables -mfunction-return=thunk-extern -fno-jump-tables -mharden-sls=all -fpatchable-function-entry=16,16 -fno-delete-null-pointer-checks -O2 -Wframe-larger-than=1024 -fstack-protector-strong -Wno-main -fno-omit-frame-pointer -fno-optimize-sibling-calls -ftrivial-auto-var-init=zero -fzero-call-used-regs=used-gpr -pg -mrecord-mcount -falign-functions=16 -Wvla -Wno-pointer-sign -Wno-maybe-uninitialized -Wno-array-bounds -Wno-alloc-size-larger-than -Wimplicit-fallthrough=5 -fno-strict-overflow -fno-stack-check -fconserve-stack -Werror=date-time -g -gdwarf-5 -include /tmp/vbox.0/include/VBox/SUPDrvMangling.h -fno-omit-frame-pointer -fno-pie -Wno-declaration-after-statement -I./include -I/tmp/vbox.0/ -I/tmp/vbox.0/include -I/tmp/vbox.0/r0drv/linux -D__KERNEL__ -DMODULE -DRT_WITHOUT_PRAGMA_ONCE -DRT_OS_LINUX -DIN_RING0 -DIN_RT_R0 -DIN_SUP_R0 -DVBOX -DRT_WITH_VBOX -DVBOX_WITH_HARDENING -DSUPDRV_WITH_RELEASE_LOGGER -DVBOX_WITHOUT_EFLAGS_AC_SET_IN_VBOXDRV -DIPRT_WITHOUT_EFLAGS_AC_PRESERVING -DVBOX_WITH_64_BITS_GUESTS -DCONFIG_VBOXDRV_AS_MISC -DRT_ARCH_AMD64  -fsanitize=bounds-strict -fsanitize=shift -fsanitize=bool -fsanitize=enum  -DMODULE  -DKBUILD_BASENAME='"SUPDrv_linux"' -DKBUILD_MODNAME='"vboxdrv"' -D__KBUILD_MODNAME=kmod_vboxdrv -c -o /tmp/vbox.0/linux/SUPDrv-linux.o /tmp/vbox.0/linux/SUPDrv-linux.c   ; ./tools/objtool/objtool --hacks=jump_label --hacks=noinstr --hacks=skylake --retpoline --rethunk --sls --stackval --static-call --uaccess --prefix=16   --module /tmp/vbox.0/linux/SUPDrv-linux.o
/bin/sh: 1: gcc-12: not found
make[2]: *** [scripts/Makefile.build:251: /tmp/vbox.0/linux/SUPDrv-linux.o] エラー 127
make[2]: *** 未完了のジョブを待っています....
make[1]: *** [Makefile:2037: /tmp/vbox.0] エラー 2
make: *** [/tmp/vbox.0/Makefile-footer.gmk:133: vboxdrv] エラー 2
ビルドのために、gcc-12を呼び出している。
かなり新しいgccだ。

自分のUbuntu環境には、gcc-11は入っているが、gcc-12は入っていなかった。
Retpolineなどはコンパイラで対応するので、新しいコンパイラが推薦されているのかもしれない。
gcc-12系も、gcc-12.3まで進んでおり、そろそろ安定しているだろう。
"apt-cache search gcc-12"で探すと、Ubuntu 22.04用パッケージもある。
無理にgcc-11でビルドするのではなく、gcc-12を使うことにした。

以下のようにしてインストールした。
$ sudo apt-get install --install-suggests gcc-12
--install-suggestsは、「提案パッケージ」のインストールを要求するものだ。
不要かもしれないが、ロケールパッケージなども入るので指定しておいた。

これで、vboxconfigを実行すると、
$ sudo /sbin/vboxconfig 
vboxdrv.sh: Stopping VirtualBox services.
vboxdrv.sh: Starting VirtualBox services.
vboxdrv.sh: Building VirtualBox kernel modules.
$
再コンパイルとインストールに成功。
VirtualBox を起動できるようになった。

2023年12月23日土曜日

FAT filesystem のVolume label

先日UbuntuのInstallに利用したUSBメモリをWindowsで再利用しようとしたら、うまくできなかった。
UEFIのパーティションや、パーティションテーブル、なんならMBRも消して作り直したいのだが、どうにもできない。
Windowsも少しずつ変わっている。私が昔のやり方しか知らないためかもしれない。

悩んでいてもしょうがないので、Ubuntuでやることにした。
UbuntuのInstallのための後始末を、Ubuntuでやるのは当然であるとも言える。
fdiskでMBRのパーティションテーブルを作り直して、mkfs.vfatでフォーマットを行った。
昔とほとんど変わらない。
これでWindowsで使えるようになる。

ふと「わかりやすいボリュームラベルでも付けておこうかな。」と、思った。
昔のことを色々思い出していた。そのせいか、PC-9801のMS-DOSのころ"dir"と打つたときの「ボリュームラベルは”xxxx”です。」が頭に浮かんだ。

mkfs.vfatでは、-n <ボリュームラベル> と --codepage <コードページ番号> を指定すれば、BPB上のボリュームラベル領域にセットできる様子。
コードページを指定するということは、OEM文字セット、すなわち日本語も正しく指定すれば使えるようだ。
実際に使おうとしたら、以下のように、エラーになる。
$ mkfs.vfat -n "試験用" --codepage 932 /dev/sdc1
mkfs.fat 4.2 (2021-01-31)
mkfs.vfat: Labels with characters below 0x20 are not allowed
0x20より小さいって、CP932(Shift_JIS)の半角カナや漢字の第一バイトを符号付き8bitで扱っている?

ソースパッケージ(dosfstools)をダウンロードして、確認した。
src/common.cの最後の、関数validate_volume_label()で、エラーチェックを行っている。
引数doslabel[]はOEMコードページで書かれたボリュームラベル文字列だ。
char型であり、そのまま0x20と比較していた。
   312	/*
   313	 * Validate volume label
   314	 *
   315	 * @param[in]   doslabel   Label stored according to current DOS codepage
   316	 *
   317	 * @return   bitmask of errors
   318	 *           0x01 - lowercase character
   319	 *           0x02 - character below 0x20
   320	 *           0x04 - character in disallowed set
   321	 *           0x08 - empty or space-only label
   322	 *           0x10 - space at beginning
   323	 */
   324	int validate_volume_label(char *doslabel)
   325	{
   326	    int i;
   327	    int ret = 0;
   328	    wchar_t wlabel[12];
   329	
   330	    if (dos_string_to_wchar_string(wlabel, doslabel, sizeof(wlabel))) {
   331	        for (i = 0; wlabel[i]; i++) {
   332	            /* FAT specification: Lower case characters are not allowed in DIR_Name
   333	                                  (what these characters are is country specific)
   334	               Original label is stored in DOS OEM code page, so islower() function
   335	               cannot be used. Therefore convert original label to locale independent
   336	               wchar_t* and then use iswlower() function for it.
   337	            */
   338	            if (iswlower(wlabel[i])) {
   339	                ret |= 0x01;
   340	                break;
   341	            }
   342	        }
   343	    }
   344	
   345	    /* According to FAT specification those bytes (after conversion to DOS OEM
   346	       code page) are not allowed.
   347	     */
   348	    for (i = 0; i < 11; i++) {
   349	        if (doslabel[i] < 0x20)
   350	            ret |= 0x02;
   351	        if (doslabel[i] == 0x22 ||
   352	            (doslabel[i] >= 0x2A && doslabel[i] <= 0x2C) ||
   353	            doslabel[i] == 0x2E ||
   354	            doslabel[i] == 0x2F ||
   355	            (doslabel[i] >= 0x3A && doslabel[i] <= 0x3F) ||
   356	            (doslabel[i] >= 0x5B && doslabel[i] <= 0x5D) ||
   357	            doslabel[i] == 0x7C)
   358	            ret |= 0x04;
   359	    }
   360	
   361	    if (memcmp(doslabel, "           ", 11) == 0)
   362	        ret |= 0x08;
   363	
   364	    if (doslabel[0] == ' ')
   365	        ret |= 0x10;
   366	
   367	    return ret;
   368	}
他のOEM文字セットでは、8bit文字を使わないのかな?
符号なし8bitで比較するように直して、バイナリパッケージをリビルドして、インストール。
それで、mkfs.vfatをしたら、日本語ボリュームラベルを付けることができた。

ここまではいい。

ボリュームラベルは、ルートディレクトリ上に特別な属性をもつディレクトリエントリを作ることでも表現できる。
本来、この文字列とBPB内のボリュームラベルは同じものを示すはずだ。
そして、CP932ではディレクトリエントリで特別な考慮が必要になる。

CP932の文字セットには、0xE5で始まる文字がいくつか存在している。
ファイル名が0xE5で始まるディレクトリエントリは、削除されたエントリとして扱われる。そのため、ファイル名の先頭で0xE5を使いたい場合、0x05に置き換えるというルールがMS-DOSのころから存在している。
このルールは、どうなるんだろう?

BPBのボリュームラベルは、ディレクトリエントリの一部ではない。
しかし、両方同じボリュームラベルであることは違いない。
試しに0xE5で始まる文字列"蛆虫"(「うじむし」こんな名前普通は使わないけど)を、mkfs.vfatでボリュームラベルにしてみた。

WindowsにUSBメモリを挿入すると、"蛆虫"の"蛆"が文字化けした。
やっぱ、0xE5がダメだったのかな?と思って、ddを使って無理やり0xE5を0x05にしてみた。
それでも、Windowsでは、文字化けしてしまう。

Windowsは、何を求めているんだろう?
Windowsでボリュームラベルに"蛆虫"を指定してフォーマットしようとした。
エラーになって、フォーマットできない。
今度は試しに、ボリュームラベルに”良い蛆虫”を指定した。
すると、エラーなしにフォーマットできた。
なんと! Windows では、0xE5 で始まる文字列をボリュームラベルに使えないのだ。
なんか微妙に違っているがやっぱり、BPBでもダメってことだ。

そんなのあり?
とはいえ、0xE5で始まる文字は、JIS第2水準であり、使えなくても多くの場合問題にならない。
ま、いいか。

2022/12/23 ソースコードの色が悪く、読みにくかったので直した。ついでに細かく修正。

2023年10月28日土曜日

Acrobat文書を読みやすく

UbuntuでAcrobat文書を読む場合、Evinceを使う。
Acrobatのようにリッチな機能はないが、「メモ」や「テキストのハイライト」はある。

私のマウスには、普通のボタンの他に、「進む」「戻る」ボタンもついている。
Ubuntuでもブラウジング時「戻る」ボタンが使える。
何か新しいことを調べている時、ハードウエアの資料を読んでいる時、文書内を行ったり来たりする。
前のページに戻りたいときに、親指で「ぷちっ」とやれば戻れるのはすごく便利だ。

Acrobat文書も目次や索引など、リンク機能を持つものがある。
そして、Evinceも(もちろんAcrobat Readerも)この「親指戻し」が使える。
使っているうちに癖になり、「親指戻し」が普通になる。

先日、ずっと使ってきたマウスの左ボタンの調子が悪くなった。
強く押せば反応するが、使っているとだんだんイライラしてくる。
あまりにもイライラしてきたので、大宮のビックカメラでマウスを買ってきた。
省電力で電池長持ちをうたっているものを買ってきた。

ところが、その新しいマウスには「進む」「戻る」ボタンがなかった。
ブラウジングもAcrobat文書も、行ったり来たりが面倒になった。

WindowsのAcrobat Readerでは、キーボードから<Alt>← を入力しても「戻る」になる。
しかしながらEvinceでは、<Alt>p 「履歴の前ページへ移動する」、<Alt>n 「履歴の次ページへ移動する」である。
これでもいいのだが、なんとも使いにくい。

このページで、ショートカットを書き換える方法が紹介されている。
しかし、「進む」「戻る」には使えない。

これはメニューが提供している機能にショートカットを結びつけるものだ。
Evinceの結び付けるべき機能「履歴の前ページへ移動する」がメニュー内にない。仮にメニュー外の機能にショートカットを結び付けることができたとしても、どのようにその機能を指定すればいいかわからない。

こうなったら最後の手段、ソースパッケージを得て改造する。

以下はUbuntu22.04でのやり方。
まず、ソースパッケージを得る。サブディレクトリを作ってその中で作業する。
$ mkdir evince
$ cd evince
$ apt-get source evince
これは普通のユーザ(sudoしない)で実行する。

次にビルド依存物を得る。
$ sudo apt-get build-dep evince
これはsudoで実行。たぶん数十個のパッケージが入る。

必要な部分を書き換える。
aptでソースパッケージをダウンロードすると、ソースコードが展開された状態(dpkg-source -x xxxx.dscを実行した状態)になっている。
展開されたサブディレクトリに移る。
$ ls
evince-42.3                         evince_42.3-0ubuntu3.dsc
evince_42.3-0ubuntu3.debian.tar.xz  evince_42.3.orig.tar.xz
$ cd evince-42.3/
$
書き換えるファイルは、"shell/ev-application.c" だ。
自分の好みのエディタで開いて、関数ev_application_startup() の配列変数 action_accels[] の初期化部分の、967行付近、"win.go-next-page"の行を書き換える。
"<Alt>Left" を割り当てたかったが、なぜか無視されてしまう(Ubuntuだから?)。

次善の策として、"<Alt>BackSpace" とした。
   943	static void
   944	ev_application_startup (GApplication *gapplication)
   945	{
   946	        const gchar *action_accels[] = {
   947	          "win.open",                   "<Ctrl>O", NULL,
   948	          "win.open-copy",              "<Ctrl>N", NULL,
   949	          "win.save-as",                "<Ctrl>S", NULL,
   950	          "win.print",                  "<Ctrl>P", NULL,
   951	          "win.show-properties",        "<alt>Return", NULL,
   952	          "win.copy",                   "<Ctrl>C", "<Ctrl>Insert", NULL,
   953	          "win.select-all",             "<Ctrl>A", NULL,
   954	          "win.save-settings",          "<Ctrl>T", NULL,
   955	          "win.add-bookmark",           "<Ctrl>D", NULL,
   956	          "win.delete-bookmark",        "<Ctrl><Shift>D", NULL,
   957	          "win.close",                  "<Ctrl>W", NULL,
   958	          "win.escape",                 "Escape", NULL,
   959	          "win.find",                   "<Ctrl>F", "slash", "KP_Divide", NULL,
   960	          "win.find-next",              "<Ctrl>G", "F3", NULL,
   961	          "win.find-previous",          "<Ctrl><Shift>G", "<Shift>F3", NULL,
   962	          "win.select-page",            "<Ctrl>L", NULL,
   963	          "win.go-backwards",           "<Shift>Page_Up", NULL,
   964	          "win.go-forward",             "<Shift>Page_Down", NULL,
   965	          "win.go-next-page",           "n", "<Ctrl>Page_Down", NULL,
   966	          "win.go-previous-page",       "p", "<Ctrl>Page_Up", NULL,
   967	          "win.go-back-history",        "<alt>P", "Back", "<alt>BackSpace", NULL,
   968	          "win.go-forward-history",     "<alt>N", "Forward", NULL,
   969	          "win.sizing-mode::fit-page",  "f", NULL,
  : (省略)
書き換えたら、保存してエディタを終了。

ビルドするパッケージのバージョンを上げておくために、"dch -i"を実行しておく。
実行しようとすると…
$ dch -i
dch warning: neither DEBEMAIL nor EMAIL environment variable is set
dch warning: building email address from username and FQDN
dch: Did you see those 2 warnings?  Press RETURN to continue...
とりあえず、ここではリターンキーを入力して、次へ進める(書いてあることは読んでね)。
すると、エディタが起動して、更新のメモの入力が促される。
一応、私は”Add shortcut key <alt>BackSpace to "win.go-next-page".”と入力したが、わかれば何でもいい。
evince (42.3-0ubuntu4) UNRELEASED; urgency=medium

  * Add shortcut key <alt>BackSpace to "win.go-next-page".

 -- Shin IWASAKI <shin@xxxxxxxx>  Sat, 28 Oct 2023 10:19:08 +0900

evince (42.3-0ubuntu3) jammy; urgency=medium
 : (省略)
修正したので、ビルドする。
自分で使うだけなら、ソースパッケージを作りなおす必要はないだろう。
バイナリパッケージだけ作成する。
$ dpkg-buildpackage -us -uc -b
色々表示される。しばらく待っているとビルドが終わる。

ビルドが終わったら、サブディレクトリ"evince-42.3/"から抜ける。
ソースパッケージを取得したディレクトリ内に、バイナリパッケージができている。
$ cd ../
$ ls
evince-42.3
evince-common_42.3-0ubuntu4_all.deb
evince-dbgsym_42.3-0ubuntu4_amd64.ddeb
evince_42.3-0ubuntu3.debian.tar.xz
evince_42.3-0ubuntu3.dsc
evince_42.3-0ubuntu4_amd64.buildinfo
evince_42.3-0ubuntu4_amd64.changes
evince_42.3-0ubuntu4_amd64.deb
evince_42.3.orig.tar.xz
gir1.2-evince-3.0_42.3-0ubuntu4_amd64.deb
libevdocument3-4-dbgsym_42.3-0ubuntu4_amd64.ddeb
libevdocument3-4_42.3-0ubuntu4_amd64.deb
libevince-dev_42.3-0ubuntu4_amd64.deb
libevview3-3-dbgsym_42.3-0ubuntu4_amd64.ddeb
libevview3-3_42.3-0ubuntu4_amd64.deb
複数のバイナリパッケージができている。すべてインストールする。
$ sudo dpkg -i *.deb

これで、<Alt>BackSpace でも、「戻る」機能が動作する。

実際に使ってみると…使いにくい!
リンクをクリックする時マウスを握っているのに、戻るためにはキーボードに手を移動させる。
この動作が面倒なのだ。
ブラウザ画面上の「←」ボタンを押すのも面倒な人には、マウスから手を離すのも面倒なのだ。

結局「戻る」ボタンありのマウスを、また用意した。
省電力マウスも、ショートカットの書き換え方法調査も、ショートカットの改造も、すべて無駄だった。

ひさびさに暴走機関車。2万回転の空回り。
とりあえず、改造したまま使いつづける。
色々調べたので、得られたものも多い(記事には書いてないけど)。それだけでも良いか。