18:06:10 # Life CPPCON 2020のビデオをみていた。 ランチ時間にRing Fit Adventure と Fit Boxingで運動をするのに若干飽きてきたので YoutubeでCPPCON2020のビデオを全部一通り流しながらやってみました。 C++20の機能とかこれから実装したい機能とかを頑張ってみんな説明してくれてありがたい。 modulesとかrangeとか試したくてもなんかいまいちうごいてい気がしたけど今だったらもっと動いているのかな? ライトニングトークのビデオは5分くらいなんだけどほとんどのビデオは1時間あって、そういうのが80本くらいあるので80時間くらいは誰かがC++について熱く語るのを聞いていた気がする。 見た結果C++難しい、という印象がより強くなった気がするが・・・。
18:25:04 # Life Gnomeがサスペンドする問題について調べていた。 キーボードとかのアクティビティを見ているので、例えばSSHされているだけではIdleタイマーがリセットされないということがわかった。 そこをつかさどるのがmutter/src/backends/meta-idle-monitorあたりっぽい。 調べた感じよい方法が思いつかない。とりあえずDebianにおいてはこういう場合は/etc/gdm3/greeter.dconf-defaultsを編集して sleep-inactive-ac-timeout=0にしてタイムアウトを無効にするのがよさそう。 確認方法はgsettings list-recursivelyで確認、と確認してみたらなんか効いてない? ひょっとすると初回ログインにコピーされてしまうのか? ということでとりあえずgsettings setで設定したら反映された。
$ gsettings list-recursively org.gnome.settings-daemon.plugins.power $ sudo -u Debian-gdm gsettings list-recursively org.gnome.settings-daemon.plugins.power $ gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-ac-timeout 0 $ sudo -u Debian-gdm gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-ac-timeout 0
09:15:53 # Life Emacs lispで現在選択している領域を囲む。 HTMLタグで囲みたいなぁとおもって、どうやるのかなと思ったので確認。 まず、interactiveでrを指定するとbegin end の2つ値をくれるというのを確認。 あと複数のパラメータがほしい場合はinteractiveは改行区切りらしい。なんじゃそりゃ。 あと編集しても維持できる文字位置を保存したい場合にはset-markerで保存、make-markerでからのマーカーを作成してから指定。 マーカーの数は編集速度に影響するらしいので再利用できるAPIになっているようだ。 ということで今日のLispハックは以下。
(defun dancer-region-tag (begin end tag) "Surround region with TAG" (interactive "r\nsTag:") (goto-char end) (insert tag) (let* ((real-end (set-marker (make-marker) (point)))) (goto-char begin) (insert tag) (goto-char real-end)))
10:29:47 # Life Debian流儀でのWake On Lanの設定。 Systemdで設定する方法とかnmで設定する方法とかいろいろあるみたいだけど結局Debianをインストールしたそのままの状態だとinterfaces(5)で設定されているということを発見するまでが長かった。 ネットワークの設定をsystemdとかnmとかに切り替えても良いんだけど、Debianでの旧来の設定ファイルを編集するなら/etc/network/interfacesに一行追加するだけ。 ethernet-wol g。 この行の意味は/usr/share/doc/ethtool/README.Debianに書いてあった。
# The primary network interface allow-hotplug eno1 iface eno1 inet dhcp # This is an autoconfigured IPv6 interface iface eno1 inet6 auto ethernet-wol g
systemdで管理されているかどうかを確認するにはnetworkctl list で見れば良くて、systemd-networkdが起動していないという警告が 出てて、SETUPもunmanaged(管理していない)というのも出てた。最 初はsystemd.link(5)にある設定を頑張ってしていたけど反映しな いしおかしいなぁと思ってはいたが、わかってみればこういうこと だった。
$ sudo networkctl list WARNING: systemd-networkd is not running, output will be incomplete. IDX LINK TYPE OPERATIONAL SETUP 1 lo loopback n/a unmanaged 2 eno1 ether n/a unmanaged 2 links listed.
NetworkManagerのほうも同様に、こっちでも管理されていないということであった。
$ nmcli d DEVICE TYPE STATE CONNECTION eno1 ethernet unmanaged -- lo loopback unmanaged -- $ sudo ifquery -l --allow=hotplug eno1 $ sudo ifquery -l lo
14:30:18 # Life X11のCtrlとCapsを入れ替える方法。 最近はSystemdとX11が協調してキーボードの設定を調整してくれるようだ。 systemd-localed.serviceというサービスがうごいていて管轄していて、 localectl(1)コマンドで調整することができる。なんでサービスにする必要があるのかは不明? 気にする人は少ないかもしれないけど仮想コンソールとX11両方にキーボード設定が適用されてくれる。 ちゃんと途中でUSBキーボード抜き差ししても反映するみたい。 Debian流での管理はkeyboard-configurationパッケージで、例えば/etc/default/keyboardに設定が書いてある。 Debianパッケージのソースコードを眺めた感じdebian/patches/debian/Use-Debian-specific-config-files.patch にて設定ファイルの場所を/etc/X11/xorg.conf.d/00-keyboard.confから/etc/default/keyboardに変更しているのだった。しかしこれ、ドキュメントさ れてなくないか?
$ sudo localectl set-x11-keymap us pc105 us ctrl:swapcaps $ cat /etc/default/keyboard XKBMODEL=pc105 XKBLAYOUT=us XKBVARIANT=us XKBOPTIONS=ctrl:swapcaps BACKSPACE=guess
08:30:52 # Life Lenovo ThinkCenter M75s gen2にDebianをインストールしてみたメモ続き、X編。 Busterを普通にインストールした状態でstartxすると画面が認識されていない雰囲気。 調べてみるとAPU内蔵のGPUはRenoir、Linuxカーネルのソースコードの中身を検索すると drivers/gpu/drm/amd/amdgpu/amdgpu_drv.cに該当する部分があって、kernel 5.5 以降くらいでは使えるようになっているようだ。 Busterのカーネルは4.19なのでそれより以前。 ちょっと迷ったけどまぁもうすぐリリースなのでとBullseyeにアップデート。カーネル5.10 になったので再起動したら起動したコンソールの解像度が画面にあった解像度に。 どうもamdgpudrmfbがコンソール画面になってくれたよう。 startxでXも起動。あとはctrl とcapsを入れ替えれば良いんだがどうするのか。
0x1002, 0x1636, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RENOIR|AMD_IS_APU [ 6.251021] fbcon: amdgpudrmfb (fb0) is primary device
14:19:39 # Life 今月読んだ本の読書メモ。
15:43:15 # Life Lenovo ThinkCenter M75s Small Gen2 の速度確認。 いつも使っている手元の趣味開発環境はRaspberry pi 3だったり Acer Chromebox CXI3 (SION) (CPUはCore i5-8250U 1.6GHz 4 core 8 threads)なんだけど、 Lenovo ThinkCentre M75s Gen 2、 AMD Ryzen 5 PRO 4650G (3.7GHz, 3MB)の速度を確認してみることにした。 いつもビルドしている趣味プロジェクトのごちゃっとテストとかもうごくninjaを実行する時間を比較してみたら、 CPU時間が倍くらいはやくていつもの環境はなんでこんなに遅いのかとびっくりする結果に。え、そんなに違うの?
Lenovo ThinkCentre M75s Gen 2 AMD Ryzen 5 PRO 4650G (3.7GHz, 3MB, 6 core 12 threads) real 0m6.364s user 0m42.769s sys 0m2.897s ChromeBox fizz SION crostini Core i5-8250U 1.6GHz 4 core 8 threads real 0m14.968s user 1m20.183s sys 0m10.582s Raspberry pi 3、4 cores real 1m43.559s user 5m17.088s sys 0m16.586s MacBook Air 6,1 Early 2014 Intel(R) Core(TM) i7-4650U CPU @ 1.70GHz 2 core 4 threads. real 0m18.329s user 0m59.608s sys 0m3.792s GCE n1-standard-4 (broadwell, Intel(R) Xeon(R) CPU @ 2.20GHz) PD-HDD real 0m20.865s user 1m6.492s sys 0m6.318s
17:54:23 # Life 最近の作業スタイルにあわせてポモドーロテクニック用のタイマーを作り直した。 開始とともに音がなり、30秒位何をするのか宣言して、50分になったら何が達成できたかを共有して休憩10分間。 ポモドーロタイマーの25分はちょっと短すぎてあと休憩時間が長かったり短かったりするのはいまいち継続できなかったし、 操作するのが頻繁すぎて忘れるのでこれくらい何も操作しないのが良いかなと思った。 これで行けるかどうかはもうちょっと試してみないとわからない。 タイマーアプリ。
18:19:13 # Life Lenovo ThinkCenter M75s Small Gen2にDebianをインストールしてみた。 Ryzenが使ってみたかったのでクリックしていたのだが10日くらいで届いたので試してみた。 事前準備として、Chrome OS 上でDebianのISOイメージを準備、ファイル名を.binで終わるようにして Chrome OS リカバリツールでUSB sd cardリーダ上のmicro sdに書き込んだ。 まず最初に入っているWindowsを起動してLenovoの管理ツール(Commercial Vantage)でアップデートをし、 BIOSのアップデートなどを実行。懐かしのDOS画面を拝見。 Lenovoロゴの出ているブート画面にどのキーを押したら何が起きるのかという情報が出ないのでなんどか試行錯誤のため再起動を繰り返した。 SecureBootで動かせる気がしなかったので起動画面でF1を押してBIOS設定でSecureBootをオフ。 起動してF10を押してDiagnosticsを眺めながらこれじゃないなぁと試行錯誤(必要なかった)。 起動してF12を押してブートデバイスを選択する画面を発見。 どれだ一体、と思ったんだけどデバイスの名前が USB CDROM Generic USB3.0 CRW-SD/MS1.00というのになっていた。CDROM? まぁそこからはふつうにインストールできてネットワークも認識して満足。
09:10:30 # Life git-status消えてしまって困ったなぁとおもっていたらvcで大体同じことができることに気づいた。 C-x v d でディレクトリモードにはいり、適当にファイルを選択してコミットすることができる。 しかしコミットメッセージのテンプレートがほしいんだけどコマンドでgit commit -a -v してEDITOR=emacsclientとしておいてemacsから編集するようにしているほうがよいかも。 C-x v v に (shell-command "EDITOR=emacsclient git commit -a -v &") と指定したほうがよいんかな。
11:15:05 # Life journalctlでファイル消す。 なんかjournaldのログが1GBくらいあるのがきになったので。 sudo journalctl --vacuum-time 10d としてみたらファイルが98個削除された。 /etc/systemd/journald.confを眺めた感じ一か月に一回はログをローテートするようになっているよう。 そして、デフォルトは100ファイルまで保存するようになっている。 8MBを超えるとログがローテートされているっぽくて、800MB常に保持しているのか。 そもそもエラーログをはき続けているのも問題なのでこれはcrostiniの問題かな?いやしかし100ファイルまでの保存は1GBか。
10:29:47 # Life EmacsでGit管理しているときにでてくるVCモードの *vc-log* バッファのコミットメッセージのテンプレートを作成したい。 どうしたらよいか、ソースとドキュメントを眺めてみる。 EmacsのVCモードはバージョン管理ツール汎用のモードで、vc-gitはGitようの実装、汎用の部分はvcモードが実装している。VCでコミット操作はvc-checkinっぽくて、そこから vc-git-checkinがよばれているっぽい。 つまりコミットメッセージの編集まわりはVCの管轄でvc-gitに処理がわたっている段階ではすでにコミットメッセージはEmacs側から与えられている。 さすがにコミットメッセージの仕組みは全く同じではないと思うのでバックエンドごとにいろいろカスタマイズしているんじゃないかという予想がつくがどうなっているんだろう。 vc-before-checkin-hookとvc-checkin-hookというフックがあるようだ。 vc-start-logentry処理、 vc-before-checkin-hookはコミットメッセージ編集前、 vc-checkin-hookはコミットメッセージ編集後っぽい。 vc.elのvc-checkinにわたってくるパラメータのcommentと initial-contentsがそれっぽいがここをどうかえるのか。 とおもってしらべていたらコメントが書いてあった。 いやしかし。
12:08:43 # Life raspberry pi 3でシンプルなfor loopでの負荷をかけてみた。 全コアで動かしてみるとかならずコア0番が一番遅いっぽい。 /proc/interruptsをながめるとコア0番が割り込みを全部うけているのかな。こういうのはどういう仕組みなんだったろうか。
$ cat /proc/interrupts CPU0 CPU1 CPU2 CPU3 17: 21502192 0 0 0 ARMCTRL-level 1 Edge 3f00b880.mailbox 18: 48 0 0 0 ARMCTRL-level 2 Edge VCHIQ doorbell 40: 0 0 0 0 ARMCTRL-level 48 Edge bcm2708_fb DMA 42: 137359 0 0 0 ARMCTRL-level 50 Edge DMA IRQ 44: 2287903 0 0 0 ARMCTRL-level 52 Edge DMA IRQ 56: 2222544811 0 0 0 ARMCTRL-level 64 Edge dwc_otg, dwc_otg_pcd, dwc_otg_hcd:usb1 77: 1443662 0 0 0 ARMCTRL-level 85 Edge 3f804000.i2c 80: 2079078 0 0 0 ARMCTRL-level 88 Edge mmc0 81: 4207 0 0 0 ARMCTRL-level 89 Edge uart-pl011 86: 46804443 0 0 0 ARMCTRL-level 94 Edge mmc1 161: 0 0 0 0 bcm2836-timer 0 Edge arch_timer 162: 55166228 78210063 47503666 78307132 bcm2836-timer 1 Edge arch_timer 165: 0 0 0 0 bcm2836-pmu 9 Edge arm-pmu FIQ: usb_fiq IPI0: 0 0 0 0 CPU wakeup interrupts IPI1: 0 0 0 0 Timer broadcast interrupts IPI2: 22952464 86791620 61433702 87885218 Rescheduling interrupts IPI3: 637958 908167 856293 1170053 Function call interrupts IPI4: 0 0 0 0 CPU stop interrupts IPI5: 6303231 14041324 2841915 12741199 IRQ work interrupts IPI6: 0 0 0 0 completion interrupts Err: 0
16:23:57 # Life 現在のコアを取得するというgetcpu. なんかgetcpu(2)とgetcpu(3)とsched_getcpu(3)がありそれぞれ微妙にインタフェースが違う。 全部読んでみてから結論としては多分sched_getcpuを使うべきな気がする。 sched_getcpuはintで0から順番にCPU番号が返ってきて、get_nprocs_confの数と一致しているように見える。 そしてsched_setaffinityのSET_CPUで設定する値と一致しているように見える。 CPUがonlineとconfの違いを毎回忘れるので調べることになるんだけどどっちだ。