2023-03-27 (Mon) [長年日記]
_ ACアダプターの抜き差し時に電源モードを変更する
Thinkpad T14/Ubuntu 22.04では電源モード(power profile)を「省電力」にしておかないとすぐにバッテリーがなくなってしまうので、ACアダプターの抜き差し時に自動で電源モードを変更するようにした。
最初はpower-profile-switcherというGNOMEシェル拡張を使おうとしたのだが、上手く動かなかったのでLinuxMint21でLaptopのACアダプターを抜き差しした際にスクリプトを実行するという記事を参考にACPIイベントを拾ってスクリプトを実行するようにした。
/etc/acpi/events/switch-to-battery
event=ac_adapter ACPI0003:00 00000080 00000000
action=/etc/acpi/switch-to-battery.sh
/etc/acpi/switch-to-battery.sh
#!/bin/sh
/usr/bin/powerprofilesctl set power-saver
/etc/acpi/events/switch-to-ac
event=ac_adapter ACPI0003:00 00000080 00000001
action=/etc/acpi/switch-to-ac.sh
/etc/acpi/switch-to-ac.sh
#!/bin/sh
/usr/bin/powerprofilesctl set balanced
といったファイルを作成しておいて
$ sudo systemctl restart acpid
で上手く電源モードが切り替わるようになった。
2023-01-04 (Wed) [長年日記]
_ HiDPI/LowDPIのマルチディスプレイ環境で期待通りのスケーリングが行われない
ThinkPad T14の内蔵ディスプレイ解像度は3840x2400でディスプレイ設定の「サイズ調整」を200%にしているが、外付けディスプレイの解像度は2560x1440なので100%にしている。
GTKアプリケーションの場合は、起動したディスプレイに応じたスケーリングが行われて、もう一方のディスプレイに移動しても自動的にサイズ調整されるが、ChromeやTeams/Slackクライアントだと常にプライマリディスプレイの設定に従ってスケーリングされ、ディスプレイ間を移動してもサイズ調整が行われない。
調べたところgoogle-chrome --ozone-platform=wayland
のようにオプションでXWaylandを経由せずにWayland上で直接動かせば期待通りにスケーリングされることがわかったが、今度はibus-mozcによる日本語入力ができなくなってしまった。
どうもChromiumはtext-input-v1、Waylandはtext-input-v3と、サポートしているプロトコルのバージョンが違うせいらしい。
Chromiumのissueによると
Hi, sorry I've been busy doing other work. I didn't change code, but made some test and research. I think I can restart work on after October 4. I'm still very interested in this issue.
とのことなので時間が経てば解決するのかもしれないが、当面はXWayland経由で使うしかなさそうだ。
2023-01-03 (Tue) [長年日記]
_ Ubuntu 22.04でのハイバネーション
Thinkpad T14をサスペンドして丸一日放置したらバッテリー残量が20%以下になってしまったため、ハイバネーションを利用することにした。
ルートパーティションを暗号化しているため、Enable Hibernation on Ubuntu 22.04 with LVM and Full Disk Encryptionを参考に以下の手順で設定を行った。
ハイバネーションの有効化
- スワップを無効化
$ sudo swapoff -a
- /etc/fstabのスワップの設定を以下のように修正(ない場合は追加)。
swapfile none swap sw 0 0
- スワップファイルを作成
sudo fallocate -l 32G /swapfile
sudo chown 0 /swapfile
sudo chmod 0600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
- 再起動後にスワップの設定を確認
$ sudo swapon -s
Filename Type Size Used Priority
/swapfile file 37748732 0 -2
- ルートパーティションのUUIDを確認
findmnt / -o UUID
- スワップファイルのオフセットを確認
$ sudo filefrag -v /swapfile |grep " 0:"| awk '{print $4}'
9932800..
- /etc/default/grubのカーネルコマンドラインに
resume
、resume_offset
を追加(最初resume=
の後のUUID=
が抜けていてハイバネーションからの復帰ができなかったので注意)
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=UUID=efa2cec1-29f1-47d2-a19b-e4722a969805 resume_offset=9932800"
-
sudo update-grub
で反映して再起動 -
sudo systemctl hibernate
でハイバネート、復帰できることを確認。
一般ユーザでのハイバネーション
sudoなしでハイバネートできるように、/etc/polkit-1/localauthority/50-local.d/com.ubuntu.enable-hibernate.pklaを以下の内容で作成
[Re-enable hibernate by default in upower]
Identity=unix-user:*
Action=org.freedesktop.upower.hibernate
ResultActive=yes
[Re-enable hibernate by default in logind]
Identity=unix-user:*
Action=org.freedesktop.login1.hibernate;org.freedesktop.login1.handle-hibernate-key;org.freedesktop.login1;org.freedesktop.login1.hibernate-multiple-sessions;org.freedesktop.login1.hibernate-ignore-inhibit
ResultActive=yes
電源ボタンの挙動の設定
Gnomeの[設定]>[電源管理]>[電源ボタンの挙動]を[ハイバネート]に変更
メニューの[電源オフ/ログアウト]に[hibernate]を追加
- Gnomeのシェル拡張マネージャをインストール
$ sudo apt install gnome-shell-extension-manager
- シェル拡張マネージャを起動して[探す]で、Hibernate Status Buttonを追加
$ extension-manager
_ Ubuntu 22.04のibus-mozc起動時の入力モードをひらがなにする
Super+Spaceでibus-mozcを起動した時に入力モードが直接入力になっていて不便(英語キーボードだとibus-mozc上でIMEをオンにするキーを割り当てるのも難しい)なのでUbuntuのibus-mozcでひらがなをデフォルトにするを参考にひらがなになるようにした。
ただし、dpkg-buildpackageでfcitx-mozcのビルド中にエラーが発生したため、以下のように直接ibus-engine-mozcを置き換えて対処した。
$ sudo cp src/out_linux/Release/ibus_mozc /usr/lib/ibus-mozc/ibus-engine-mozc
2022-12-29 (Thu) [長年日記]
_ T14 Gen 3のSSD換装・メモリ増設とUbuntuのインストール
Macbook Pro 2018のバッテリーが1時間くらいで切れるようになってしまって、注文していたThinkpad T14 Gen 3が届いたので、今回は久しぶりにLinuxを直接インストールすることにした。 とみたさんが同じマシンにLinuxを入れていたので大きな問題はないだろうという目論見である。
まずはその前にSSDの換装とメモリの増設を行った。
Thinkpadはケースを開けるのが楽そうだなと思っていたが、ネジを外すだけではだめだった。 XPS 13のSSDを換装した時に買っていたギターピックのような器具をヒンジ側からねじ込むとケースを外すことができた。 SSDはキオクシアの1TBのものに換装(純正はSK hynixだった)。
メモリは16GB増設。メモリもSSDもLenovo純正より格段に安い。
Ubuntuの22.04のインストールはとみたさんの記事を参考にSecure Bootを無効にしたら問題なかったが、「Windows Boot Managerとは別にインストール」でパーティション作成をインストーラまかせにしたら暗号化を選べなかったのでやり直すはめになった。 「それ以外」を選択して、/dev/nvme0n1p5をext4で/bootに、/dev/nvme0n1p6を暗号化用のパーティションにして/dev/mapper/nvme0n1p6_cryptを/に割り当てたら、ルートパーティションを暗号化してインストールできた。
voyager:~$ df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 3.2G 2.8M 3.2G 1% /run
/dev/mapper/nvme0n1p6_crypt 789G 38G 711G 6% /
tmpfs 16G 126M 16G 1% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
/dev/nvme0n1p5 1.9G 376M 1.4G 22% /boot
/dev/nvme0n1p1 256M 36M 221M 14% /boot/efi
tmpfs 3.2G 4.7M 3.2G 1% /run/user/1000
Windowsを消してインストールする場合は自分でパーティション作成しなくても暗号化できるのに、ちょっと不便である。
インストール直後は
- Bluetoothイヤホンだと音が出るのに内蔵スピーカーから音が出ない(デバイスは認識していた)
- 指紋認証が使えない
という問題があったが、apt install linux-image-oem-22.04b
でkernel 6.0.0-1009-oemを入れたら両方とも解決した。
2022-12-25 (Sun) [長年日記]
_ ...
を*, **, &
の構文糖にすると言ったな、あれは嘘だ
Ruby Advent Calendar 2022の25日目の記事です。
昨日は羽角さんのirb.wasmの入力メソッドをSTDIOからRelineへ改修した話でした。
前回のあらすじ
前回の記事で、
Ruby 3.2で
*
と**
が導入されましたが、当初は...
と併用されることを想定しておらず、すこしいびつな仕様になっていました。...
は*, **, &
の構文糖であるというシンプルな仕様に修正しました。
と言っていました。ところが……
遅くなった?
松田さんから*, **
や...
による委譲が遅いというissueが報告されました。
forwardableを使った場合に比べて2倍以上遅いとのこと。forwardableが何でそんなに速いかというとruby2_keywordsを使っているからで、前回の記事でも書いたようにFeature #19134の修正前は
def foo(...)
bar(...)
end
は
ruby2_keywords def foo(*, &)
bar(*, &)
end
の構文糖でした。正直ruby2_keywordsという盲腸みたいな機能で速いのはずるいと思うんですが……。
修正案
実際のアプリケーションではそれほど影響はなさそうな気もしましたが、Railsでたくさん使われているらしいということで、修正案として、...
と*
/**
の併用を禁止するという提案をしました。
&
についても禁止してもいい気もしますが、Ruby 3.1で併用できていて互換性の問題があるということでこちらはそのまま。
ささださんによる最適化
リリースまで時間もないので上記の修正を行うつもりでまつもとさんの返事を待っていたところ、ささださんが最適化してみるのでちょっと待って、ということになり、休暇中のはずのささださんによってpull requestが作成されました。
f(*a, *kw)
の呼び出し規約を変えるという結構インパクトのある修正で、リリースまで12日しかなくてYJITチームの何名かはもうすぐ休暇に入ってしまうという話もあり、Ruby 3.2での導入は見送られました。
この最適化自体は、...
の仕様をどうするかに関わらず有用なので、おそらくRuby 3.3で取り込まれると思います。
修正
ということで、結局修正案のとおり、...
と*
/**
の併用を禁止するように修正しました。
修正中、以下の部分が最初抜けていてテストが通らずはまりましたが、元のなかださんのコードでは#define idFWD_KWREST 0
していたのでこの#ifdef
は不要だったという罠でした。
args_forward : tBDOT3
{
/*%%%*/
+#ifdef FORWARD_ARGS_WITH_RUBY2_KEYWORDS
+ $$ = 0;
+#else
$$ = idFWD_KWREST;
+#endif
/*% %*/
/*% ripper: args_forward! %*/
}
今回の修正でFORWARD_ARGS_WITH_RUBY2_KEYWORDS
が#define
されていなければruby2_keywordsを使わなくなったので、Ruby 3.2でささださんの最適化が入ったらそうするとよいように思います(が多分忘れる)。
まとめ
Ruby 3.2で...
を*, **, &
の構文糖にすると言っていましたが、そうはなりませんでした。
_ あ [--gtk-version=4フラグをつけてあげると日本語打てるようになります。 ぜひ!]
_ shugo [ありがとうございます。試してみます!]
_ shugo [google-chrome --ozone-platform=wayland --gtk-version=4で試しま..]