Emacs 26.1のc-modeのシンタックスハイライトが重いでござる(未解決)
EmacsでC++を書いてるとバッファが超重くなることがある。キー入力やスクロールがツーテンポくらい遅れる感じ。他のバッファには影響しないので物凄く困ってるわけではないが、地味にストレスでござる。
発生条件がさっぱりわからんのが困りどころ。重くなるファイルでも開いた直後は大丈夫だったりして、編集しているうちに何かの拍子で重くなる。ファイルの大きさ自体はさほど関係ないようだ(起きないやつは行数が多くても起きないし、起きるやつは100行程度のソースでも起きる)。何となく、コメントないしマルチバイト文字成分多めのファイル、C++11なコードで発生しやすいような感じ。
ほぼ間違いないのはc-modeが原因であるということ。他のmodeでは発生しないし…。恐らくFont Lockがらみが原因と思われる
(2019-07-09 追記)
M-x font-lock-modeでFont Lockの有無を切り替えると明らかに速度が変わるので、Font Lockがらみなのも間違いない。
未だ解決には至ってないが、毎度profileとるのが面倒なのでメモがてら記事にしとく。
Function CPU samples % - redisplay_internal (C function) 736 68% - jit-lock-function 731 68% - jit-lock-fontify-now 731 68% - jit-lock--run-functions 725 67% - run-hook-wrapped 725 67% - #<compiled 0x1b94275> 725 67% - font-lock-fontify-region 725 67% - c-font-lock-fontify-region 722 67% - font-lock-default-fontify-region 658 61% - font-lock-fontify-keywords-region 647 60% - c-font-lock-declarations 320 29% - c-find-decl-spots 313 29% - #<compiled 0x1c22bc1> 234 21% - c-get-fontification-context 125 11% - c-back-over-member-initializers 64 5% + c-just-after-func-arglist-p 18 1% + c-parse-state 16 1% + c-back-over-compound-identifier 14 1% + c-at-toplevel-p 10 0% + c-backward-sws 5 0% + c-looking-at-or-maybe-in-bracelist 47 4% + c-backward-token-2 6 0% + c-back-over-compound-identifier 3 0% + c-forward-decl-or-cast-1 60 5% + c-font-lock-single-decl 15 1% + c-backward-sws 14 1% + c-backward-token-2 4 0% c-syntactic-re-search-forward 2 0% + c-forward-label 1 0% + c-bs-at-toplevel-p 52 4% + c-beginning-of-macro 5 0% + c-forward-sws 3 0% + c-literal-start 1 0% c-font-lock-<>-arglists 77 7% + #<compiled 0x1c2637d> 44 4% + c-font-lock-cut-off-declarators 41 3% + c-font-lock-enclosing-decls 34 3% + c-font-lock-enum-body 24 2% #<compiled 0x1c26351> 19 1% + c-font-lock-complex-decl-prepare 11 1% + c-font-lock-enum-tail 8 0% #<compiled 0x1c272e7> 8 0% + c-font-lock-invalid-single-quotes 7 0% #<compiled 0x1c272af> 6 0% #<compiled 0x1c2631b> 6 0% #<compiled 0x1c27285> 4 0% #<compiled 0x1c2633d> 4 0% #<compiled 0x1c263a3> 4 0% #<compiled 0x1c2630b> 3 0% + c-font-lock-raw-strings 3 0% whitespace-trailing-regexp 1 0% + font-lock-fontify-syntactically-region 7 0% + font-lock-unfontify-region 1 0% + c-before-context-fl-expand-region 64 5% + file-remote-p 4 0% + eval 1 0% - ... 232 21% Automatic GC 232 21% + command-execute 103 9%
御覧の通り、c-modeのFont Lockが原因なのは間違いないんだよなー。解決方法分からんけど。
以前はそれほど気にならなかったし設定も大して変えてないので、単にマシンがしょぼいだけって線も捨てきれない。一応マシンスペックも書いておく。
CPU | Core i5-5200U (2.2GHz/2C4T) |
RAM | DDR3-1600 8GBx1 |
GPU | HD Graphics 5500 |
HDD | MQ01ABF050 |
前はUnreal Engine 4での開発に耐えられるようなデスクトップマシンだったのよねー。
FreeBSD 12のApache 2.4.39がunion semun ickふんだららでビルドエラー
FreeBSD 12.0-RELEASEへの更新中、www/apache24のports更新で以下のようなビルドエラーが起きた。
unixd.c:245:25: error: variable has incomplete type 'union semun' union semun ick; ^ unixd.c:245:19: note: forward declaration of 'union semun' union semun ick; ^ 1 error generated. *** [unixd.lo] Error code 1
union semun
が定義されとらんとな…。
ググってみたら既にバグチケが上がっていた。メンテナ曰く、当該箇所を削除するか全部のトップレベルのportsをリビルドせよとの事だが、後者は面倒でござる。というか、“全てのトップレベル”の範囲がわからんかったので、ソース修正でどうにかする。
/usr/ports/www/apache24/work/httpd-2.4.39/os/unix/unixd.c
の240行目付近、#if !APR_HAVE_UNION_SEMUN
によってunion semun
の定義がなくなっているようなので、#if
と#endif
をコメントしてやる。
apr_os_proc_mutex_t ospmutex; //#if !APR_HAVE_UNION_SEMUN ///★コメントアウト! union semun { long val; struct semid_ds *buf; unsigned short *array; }; //#endif ///★コメントアウト! union semun ick; struct semid_ds buf = { { 0 } };
あとは/usr/ports/www/apache24
の下でmake install
すればビルドは通る。……が、起動しようとするとSegmentation faultで落ちるぅorz。
見た感じdevel/apr1関係のコードのような気がするので、portmaster apr –force-config
でaprをリビルド。その後、改めてportmaster apache24 –force-config
したら無事ビルドも通って問題なく起動した。
FreeBSDにConnectXのユーティリティを入れるとファイル所有者が書き換えられる?
FreeBSD 12.0-RELEASEへの更新作業時に発覚した、システム系ディレクトリの所有者が謎の6151に書き換わってる問題の続き。
こんな感じでユーザーデータ置き場以外でroot以外が所有者のディレクトリを列挙してみた。
# find / -type d ! -uid 0 ! -path "*/home/*" ! -path "*/zdata/*" ! -path "*/zbackup/*" -print0 | xargs -0 stat -f "%u %g %N" | tee ~/non_root_owner_dirs.txt
すると、以下のディレクトリの所有者が6151になっていた。
6151 0 /etc 6151 0 /etc/mft 6151 0 /etc/mft/fwtrace_cfg 6151 0 /usr 6151 0 /usr/bin 6151 0 /usr/include 6151 0 /usr/lib 6151 0 /usr/lib/bash_libs 6151 0 /usr/lib/mft 6151 0 /usr/lib/mft/mtcr_plugins 6151 0 /usr/lib/mft/python_tools 6151 0 /usr/lib/mft/python_tools/mlxmcg 6151 0 /usr/lib/mft/python_tools/mst 6151 0 /usr/lib/mft/python_tools/mstdump 6151 0 /usr/lib/mft/tcl 6151 0 /usr/lib/mft/tcl/bin 6151 0 /usr/lib/mft/tcl/lib 6151 0 /usr/lib/mft/tcl/lib/tcl8.4 6151 0 /usr/share 6151 0 /usr/share/man 6151 0 /usr/share/man/man1 6151 0 /usr/share/mft 6151 0 /usr/share/mft/mlxconfig_dbs 6151 0 /usr/share/mft/mstdump_dbs
これらディレクトリの中を覗いてみると、いくつかのファイルも6151になっている。そして6151のやつらの大半の最終更新日が2018年11月23日だった。
書き換わってるファイル達と更新日から察するに、どうもConnectX-3のユーティリティのインストールが原因のような気がする。頼むよMellanoxさん…。
幸い、6151以外に怪しい所有者は見当たらなかったので、以下のコマンドで所有者をrootに戻して一件落着(元の所有者が本当にrootだったかどうかの確証はないけど…)
# find / -uid 6151 ! -path "*/home/*" ! -path "*/zdata/*" ! -path "*/zbackup/*" -print0 | xargs -0 chown root
FreeBSD 12.0-RELEASEのデフォルトのPerlをPerl 5.28に直す
FreeBSD 12.0-RELEASEに更新後、Samba 4.8を更新しようとしたら怒られた。
# portmaster samba48 ===>>> Currently installed version: samba48-4.8.5_1 ===>>> Port directory: /usr/ports/net/samba48 ===>>> This port is marked IGNORE ===>>> Invalid perl5 version 5.24 ===>>> If you are sure you can build it, remove the IGNORE line in the Makefile and try again.
Perl 5.24は不適切とな。例によって
/usr/ports/UPDATING
を見てみると、システムデフォルトのPerlバージョンは5.26 (20180330)を経て今は5.28(20181213)となっている模様。
20161103の記述に従い、Perlのバージョンを更新する。
まずは/etc/make.conf
にDEFAULT_VERSIONS+= perl5=5.28
を追加。
# echo 'DEFAULT_VERSIONS+= perl5=5.28' >> /etc/make.conf
Perl 5.24を5.28で置き換える。
# portmaster -o lang/perl5.28 lang/perl5.24
正常に終了したら、上記DEFAULT_VERSIONS
は消しておk。
そののち、Perl 5.24の共有ライブラリに依存するパッケージを更新。
# portmaster -f `pkg shlib -qR libperl.so.5.24`
p5-なパッケージも更新しといた方が安全かも?
# portmaster p5-
これで無事Samba 4.8のビルドが通った。
FreeBSD 11.2-RELEASEをFreeBSD 12.0-RELEASEに更新
遅ればせながら家鯖をFreeBSD 11.2-RELEASEから12.0-RELEASEへと更新した。
まずは現在の環境を最新にしておく(あまりに古いとメジャーバージョンアップに失敗することがあるため)
$ freebsd-version -ku 11.2-RELEASE-p7 11.2-RELEASE-p7 # freebsd-update fetch # freebsd-update install # reboot
ここで、ブートローダまでは起動するがカーネル読み込みでブラックスクリーンになる謎現象に2日ほど悩まされた。結局BIOS設定をデフォルト状態に戻したら直ったが、原因は恐らくデュアルCPUからシングルCPUに変えた事と思われる。うちの鯖は無駄にデュアルCPUだったので(ドヤァ
最新になったか確認。
$ freebsd-version -uk 11.2-RELEASE-p10 11.2-RELEASE-p10
12.0-RELEASEへ更新する。 </code> # freebsd-update -r 12.0-RELEASE upgrade Looking up update.FreeBSD.org mirrors… 3 mirrors found. Fetching metadata signature for 11.2-RELEASE from update2.freebsd.org… done. (略) To install the downloaded upgrades, run “/usr/sbin/freebsd-update install”. </code>
システムのインストール
# freebsd-update install Installing updates... Kernel updates have been installed. Please reboot and run "/usr/sbin/freebsd-update install" again to finish installing updates.
「再起動して再度freebsd-update install
せよ」とのことだが、ここで必ずサードパーティのkext(vboxdrvとか)を一旦無効化する。さもないと、再起動後のカーネル読み込みでクラッシュする場合がある。
# emacs /boot/loader.conf hogehoge_load="YES"の行をコメントアウトするで~
再起動
# reboot
システムのバージョンを確認してみる。システムは更新され、ユーザーランドは古いままという事が分かる。
$ freebsd-version -ku 12.0-RELEASE-p4 11.2-RELEASE-p10
ユーザーランドを更新。procの所有権を変えようとしてエラーが出てるけど、まぁ気にしない。
# freebsd-update install Installing updates...install: chown 0:0 ///proc: Operation not supported install: chmod 555 ///proc: Operation not supported Completing this upgrade requires removing old shared object files. Please rebuild all installed 3rd party software (e.g., programs installed from the ports tree) and then run "/usr/sbin/freebsd-update install" again to finish installing updates.
再度システムのバージョンを確認。ユーザーランドが更新されていることが分かる。
$ freebsd-version -uk 12.0-RELEASE-p4 12.0-RELEASE-p5
ここまで来たら、pkg-static upgrade -f
でインストール済みpackagesをすべて更新するのが正しいお作法。
なんだけれども、自分はportsでビルドしていく派なのでpkgだけ更新して、残りはちまちまportmasterする。
# pkg-static install -f pkg pkg-static: Warning: Major OS version upgrade detected. Running "pkg-static install -f pkg" recommended Updating FreeBSD repository catalogue... pkg-static: Repository FreeBSD has a wrong packagesite, need to re-create database Fetching meta.txz: 100% 944 B 0.9kB/s 00:01 Fetching packagesite.txz: 100% 6 MiB 1.7MB/s 00:04 Processing entries: 100% FreeBSD repository update completed. 31778 packages processed. All repositories are up to date. The following 1 package(s) will be affected (of 0 checked): Installed packages to be REINSTALLED: pkg-1.10.5_5 (ABI changed: 'freebsd:11:x86:64' -> 'freebsd:12:x86:64') Number of packages to be reinstalled: 1 3 MiB to be downloaded. Proceed with this action? [y/N]: y [1/1] Fetching pkg-1.10.5_5.txz: 100% 3 MiB 1.7MB/s 00:02 Checking integrity... done (0 conflicting) [1/1] Reinstalling pkg-1.10.5_5... [1/1] Extracting pkg-1.10.5_5: 100% ldconfig: /usr/lib: ignoring directory not owned by root
んん~?/usr/lib
のオーナーがrootじゃないだとー?
$ ls -al /usr total 177 drwxr-xr-x 18 6151 wheel 17 11月 23 2018 . drwxr-xr-x 25 root wheel 34 5月 29 01:20 .. dr-xr-xr-x+ 3 root wheel 3 10月 19 2011 .zfs drwxr-xr-x 2 6151 wheel 515 5月 29 00:39 bin drwxr-xr-x 2 root wheel 5 1月 29 2017 freebsd-dist drwxr-xr-x 16 root wheel 15 10月 22 2018 home drwxr-xr-x 58 6151 wheel 344 5月 29 00:33 include drwxr-xr-x 12 6151 wheel 710 5月 29 00:49 lib drwxr-xr-x 5 root wheel 720 5月 29 00:39 lib32 drwxr-xr-x 5 root wheel 5 5月 29 00:49 libdata drwxr-xr-x 9 root wheel 68 5月 29 00:39 libexec drwxr-xr-x 19 root wheel 19 11月 15 2018 local drwxr-xr-x 3 root wheel 3 7月 13 2017 obj drwxr-xr-x 72 root wheel 92 5月 29 07:49 ports drwxr-xr-x 2 root wheel 305 5月 29 00:39 sbin drwxr-xr-x 30 6151 wheel 30 5月 29 00:49 share drwxr-xr-x 26 root wheel 40 5月 29 00:34 src drwxr-xr-x 15 root wheel 18 7月 13 2017 tests
6151って誰だよ…。最早FreeBSD更新とは無関係になってきたので、続きは別記事で。