systemd のデフォルトでは /tmp は tmpfs でマウントされるようになっている。 でも Ubuntu では /tmp で tmpfs を使わないようにしてある。何度か /tmp を tmpfs にする試みはあったらしい1が……。
まあどうでもいいといえばどうでもいいが、Ubuntu の /tmp を tmpfs にする方法。
$ sudo systemctl enable /usr/share/systemd/tmp.mount $ sudo reboot これだけ。
通常、systemd では /tmp は tmp.mount でマウントされる。 Ubuntu でもこのファイルは /usr/share/systemd にインストールされるようになっていて、ユーザの好みに合わせて使える。 ただし、ここはユニットファイルの検索パスに入っていないので普通に指定すると有効化できない。 というわけで、フルパスを指定して mount unit を有効化することで、直接使えるようにしている。
起動中に /tmp をマウントし直すと中に置いてあるファイルが見えなくなってしまうので、再起動するのが安全だと思う。
入ってるパッケージが諸々古すぎるので、周辺のライブラリのビルドから始める必要がある。
そのへんを自動でやってくれるようにシェルスクリプトにまとめた。 /tmp に tmpfs がいなかったり、ホームディレクトリが NFS だったりする環境のものなので、_build_dir 系の変数は変更して使ったほうがいいと思う。
ビルド手順 まず、標準で入っている GCC は LLVM をビルドするには古すぎるので、GCC のビルドから始める必要がある。 古い LLVM から徐々にバージョンアップしていく方法でもいいが、最新の GCC はビルドできるので。ついでに GCC も最新にしてやる方が首尾が良いと思う。
で、最新の GCC をビルドするには周辺のライブラリが古すぎるので、最初にとりかかるべきはこれらのビルドということになる。 具体的には、GMP と MPFR、MPC をビルドする必要がある。
patchelf を使うと一発。elfedit というコマンドが binutils にあるっぽかったが、使い方がイマイチ分からなかった。
RPATH の追加 $ORIGIN/../lib を追加する例。ちなみに $ORIGIN はファイルがあるディレクトリを指すので、絶対パスを使うより柔軟にパスの指定ができる。
$ patchelf --add-rpath '$ORIGIN/../lib' NEEDED の追加 $ patchelf --add-needed libhoge.so.0 RPATH と NEEDED を組み合わせると LD_PRELOAD 的なことが環境変数なしでできる
下みたいな内容で適当なライブラリを作る。
int puts(const char *s) { return 0; } で、下みたいな内容の実行ファイルに patchelf する。
#include <stdio.h> int main(void) { puts("hoge"); } $ ./hoge hoge $ patchelf --add-rpath '$ORIGIN/lib' $ patchelf --add-needed 'libhoge.so.0' $ ./hoge (何も出ない) 実用性があるかは謎。
Emacs の scratch バッファで DBus のメソッドを叩いたりできるので便利。たぶん。 DBus 便利じゃんね。(分かってない)
準備 require する。M-x describe-function すると勝手に内部で require するようなので 忘れていたが、当然といえば当然。
(require 'dbus) Introspection プロパティとかインターフェースを眺めるやつ。 GNOME Shell のスクリーンショットのインターフェースを眺めてみる。 XML でなくて S 式で表示される。
(dbus-introspect-xml :session "org.gnome.Shell" "/org/gnome/Shell/Screenshot") メソッドを叩く 適当に introspection で見えた通りに引数を詰め込んでウィンドウのスクリーンショットを撮ってみる。 コマンドラインの dbus-send だと型の指定が面倒だが(まあ 1 と "1" の区別つかないのでそれはそう) Emacs だと Lisp での型が適当に DBus の型にマッピングされていて割と楽。 あと引数が一致しなかったりしたら Emacs Lisp の例外が上がる。
(dbus-call-method :session "org.gnome.Shell" "/org/gnome/Shell/Screenshot" "org.gnome.Shell.Screenshot" "ScreenshotWindow" t t nil "/tmp/foo.png") elisp の型とのマッピングだとうまくいかない場合やマッピングされていない型を使っているメソッドを叩く場合、キーワードパラメータで手動で指定できる。
なんかおかしいな〜と思いつつ何もやってなかった。 Noto の CJK フォントはインストールするだけじゃなくて自分で symbolic link 作ってやる必要あり。
$ ln -s /etc/fonts/conf.avail/70-noto-cjk.conf /etc/fonts/conf.d/. これをやっていなかったので,あらゆるフォントが Noto Sans CJK JP で描画されていて, ソースコード部分に web font 使ってないサイト(つまり自分のブログ)のソースコードとかが死んでた。
UNIX のコマンドで(本来の)機能が誤解されがちなコマンドとして cat や touch が有名な 気がするが,env もそのひとつだと思う。env の使われ方としては,単独で実行して設定されている 環境変数を見たり,shebang で bash (やその他 executable)のパスをハードコードするのを避けるために
#!/usr/bin/env bash といった感じで使われるのが多分ほとんどのような気がする。
env の本来(?)の機能は環境変数をいじってからコマンドを実行するといったところだ。 なので Bash から実行するときは env なしで
FOO=bar command といった感じで実行しているのをこういった書き方が使えない環境で実現したいと思ったときに
env FOO=bar command というコマンドで実行すると等価なことができるということだ。
小数単位でのスケーリングをしていたら XWayland のアプリケーションは ぼやけているので自明な感じはあるが,面白い(かつ見た目が良い?)見分け方を 見つけたので。
xeyes を起動する。 マウスを動かしてみる。 簡単ですね!
マウスをいろんなウィンドウの上に動かしてみて目が動くウィンドウは XWayland, 目が動かないウィンドウは Wayland で動いている。
参考 https://medium.com/@bugaevc/how-to-easily-determine-if-an-app-runs-on-xwayland-or-on-wayland-natively-8191b506ab9a xeyes のソースコード: https://gitlab.freedesktop.org/xorg/app/xeyes
XWayland だとスケーリングしたときにぼやける問題があるので,Wayland を使うようにする。
今の段階だと MOZ_ENABLE_WAYLAND=1 という環境変数があった場合は Wayland を使う ようになっている。毎回端末から実行すれば当然できるが,それは面倒なのでアイコンをクリックしたときでも Wayland を使う設定で普通に起動するようにしたい。
同じ方法で Thunderbird にも Wayland を使わせることができる。
方法1: .bashrc とかに書く 一番簡単。でも僕はむやみに環境変数足したくない派(全然関係ないプロセスからアプリケーション固有の 設定が見えるのが無駄な感じがする)なのでこの方法はあまり好きじゃない。
方法2: デスクトップエントリーをいじる /usr/share/applications/firefox.desktop を ~/.local/share/applications/ に コピーしてきて Exec の行のコマンドの先頭に env MOZ_ENABLE_WAYLAND=1 を追加する。 本当は差分だけ編集したい(systemd のユニットファイルみたく)けどそういう方法では動かなかった。
GitHub のプロジェクトのページを見ている感じではリリースは夏ごろかなと思っていたのだが, 今日 ArchLinux でアップデートが来た.
Wayland でインプットメソッドが使えない問題も直ったので,Xorg から Wayland に切り替えることができた.
Wayland に切り替えて何が嬉しいかというと,割と簡単に小数単位のスケーリングができることだ. 先日,ThinkPad X1 Carbon が届いたのだが,今回はちゃんとフルハイの解像度のを選んだので 画面の表示が小さすぎて辟易していた.それで今日のアップデートで大きく表示できるようになったので 快適になった.
ただ,この小数単位でのスケーリングは問題もはらんでいるようで,GNOME のアプリ以外の多くのアプリは の解像度が低いままで拡大されてしまう.たぶん GTK のバージョンの問題だと思うが.
入れる.
$ sudo pacman -Ss firejail 再起動する.
試しに Bash を実行する.
$ firejail bash 一見普通に Bash が起動したように見えるが, ps aux とかやってみると普通じゃないことが すぐに分かって,他のプロセスが見えない.
$ ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND kofu 1 1.5 0.0 4952 2612 pts/2 S 22:58 0:00 firejail bash kofu 3 1.5 0.0 9368 4884 pts/2 S 22:58 0:00 bash kofu 5 0.0 0.0 9844 3084 pts/2 R+ 22:58 0:00 ps aux でもこれだとホームディレクトリへの読み書きとかは普通にできる. それが嫌だったら --private をつけてやると,何もない tmpfs がホームディレクトリにマウントされる.
おしまい.