Closed28

Linux 初心者 (→ NixOS 環境構築済み)

toyboot4etoyboot4e

Linux デスクトップに慣れたい

インストール・初期設定

下記スクラップで実施しました:

https://zenn.dev/toyboot4e/scraps/05c0fbf36806d7

現環境

NixOS で i3wm を使っています。 WM は快適ですが、基本機能が普通の DE に及ばない状態です。開発もおぼつきません。ここから Linux の基本要素や Nix の醍醐味を見つけていくつもりです。

縛り

基本質問無しで行きます。ナード面ではインテリになりたいので……

脳内

今 Linux 関連の名詞が頭の中でごった煮になっています。 kernel, daemon, service, wayland, x11, systemd, systemctl, dbus, ibus, fcitx, blueman, RPATH, pkg-config, etc. 少しずつ全体像を掴めていけたらと思います。

手持ちの本

興味のある本

  • もっと上のレイヤの本がほしい
toyboot4etoyboot4e

mount のやり方から怪しい

sudo mount /dev/sda1 /media/usb1 とかやっているとファイル権限が〜〜

mount のオプション指定

一応これでユーザ権限で? マウントできます:

$ id (whoami)
uid=1000(tbm) gid=100(users) groups=1(wheel),17(audio),100(users)
$ sudo mount -o uid=1000,gid=100 /dev/sda /media/usb1/

man を見ると謎の文言が (ADFS / AFFS ってなんだ):

   Mount options for adfs
       uid=value and gid=value
       Set the owner and group of the files in the filesystem (default: uid=gid=0).

wheel グループのユーザに sudo 無しで mount, umount を許可

visudoで特定コマンドを sudo 無しで実行できるようにできるらしい? なるべく状態は持ちたくないです。オプションがあれば良いですが……

udisks2 を使う

これが正攻法な気がします。憶測ですが、『サービス』が権限を握り続けているため、一般ユーザはサービスに問い合わるだけで済み、 sudo を要求されない?:

services.udisks2.enable = true;

udisks2 + fzf で TUI

下の投稿 を参照

そもそも自動で mount されるようにする

これも udisksctl:

rofii3blocks からマウント状況確認?

TODO

toyboot4etoyboot4e

tar のやり方が分からない

毎回 tldr tar を引くのは手間です。拡張子やバイナリからファイル種別を自動判別して展開してくれるツールが必要です。また歴史的経緯も気になります。

そもそも自動で展開してくれる?

TODO

アーカイブ化と圧縮について

TODO

ツール探し

TODO

toyboot4etoyboot4e

Blender で動画編集、だと……!

だとだと……!

まずインストール

起動時点で動画編集がメイン機能のように輝いています。 Out-of-the-box で使えそうです。

軽量エディタとして使ってみる

軽量じゃないかもですが。。

  • トリミングをやってみる
  • 解像度変更
  • GIF 出力

音声編集に使ってみる

  • ノイズ除去?
  • 音圧調整?

ガッツリ編集に使ってみる

  • ゲーム紹介動画 (まずゲームを作れとなりますが)
toyboot4etoyboot4e

DE 的デスクトップ画面

Winow system, WM

  • X11 + i3
  • wayland + sway
  • wayland + Hyperland

Status bar

Login manager (display manager)

  • X11 + LightDM
  • X11 or (waylad + sway) + ly

Scratchpad で dropdown terminal (toggle terminal) xdotool で floating window 出し入れ

Dropdown termial に音やら bluetooth やら音楽プレイヤーやら音楽プレイヤーやら TUI を入れておけば良い気がします。

追記: xdotool で何でも出し入れできるようになりました: https://zenn.dev/link/comments/1f7efd1654a227

Filer

TUI:

  • Ranger
    • dragon で preview
    • 結局 ranger が安定します。

GUI:

  • Nautilus (gnome.nautilus)
    • 高 DPI 対応?
  • Thunar

Music player

  • cmus

Dock.. はいいか

  • plank
    浮かせたい。。
  • cario-docknixpkgs にはまだ無いですね

PDF viewer

  • Evince (Gnome)

Video player

  • mpv + mpv-file-browser
toyboot4etoyboot4e

DE 的ツール類

結局 DE が欲しい気はしますが (mac が好きだった) 、個別のツール類を調べていきます。

toyboot4etoyboot4e

映像出力の切り替え (X)

Xorg と xrandr

2 つ目のモニタを接続

xrandr では、出力先を端子の番号で指定します。また (--auto を使わない限り) 解像度 (mode) を自分で設定する必要があります:

$ xrandr --output HDMI-0 --left-of DP-1 --mode 1920x1080 --rotate left

映像出力先の端子は自動で切り替わりません。端子を変えると何も映らなくなります。自動で繋いでくれるサービスが欲しいですね。

周波数の設定

4K 表示だと 60 Hz にできない……? モニタのスペック的には対応しているはずなのですが。 → ケーブルが 4K 60Hz に対応していませんでした 。なるほどね……

DPI 設定でテキストのスケール

DPI というのはピクセルの密度だと思っていましたが、実際これを変えるとテキストのスケールが変わります。これは一体……?

$ xrandr --dpi 163
$ xdpyinfo | greo resolution
  resolution:    163x163 dots per inch

xrandr の設定永続化

  • xrandrHeads オプションで xorg.conf 書き換え
    xorg.conf (後述) は書き換わるのですが、まったく効果が見られません。うーむ……
  • setupCommand 直書き
    フックでコマンド実行。なんだかんだ簡単そうですが、いい感じの自動調整を失う気がして避けたいところです。

xorg.conf はどこにあるのか

https://github.com/NixOS/nixpkgs/issues/103609

  • services.xserver.exportConfiguration = true;/etc/X11/xorg.conf が出力されるようになります。
  • デフォルトでは、 /etc/lightdm/lightdm.conf中の xserver-command 中の -config 引数の先 (/nix/store/***-xserver.conf に実際の xorg.conf がありました。
  • 引数指定できる設定ファイルは基本ユーザから隠すつもりか……!

自動切り替え

未設定

新規接続のモニタに自動でつながってほしい

ディスプレイ配置の UI

arandr?

toyboot4etoyboot4e

Bluetooth よ繋がっておくれ

繋がらないのだ (・ω・) dbus?

ハードの問題ではない?

設定や設定方法の見直し

改めて接続を実施したところ、たまにデバイス一覧にペアリングデバイス名が出現します。ペアリングはできるものの接続できない。パソコンに近づくと繋がります。どうやら接続可能距離が極端に短いようです。

いや付属品にアンテナがあった

改めてマザーボード 仕様 の詳細タブを見ると、 Wifi Anntena が付属品にありました。お化粧品みたいだなーと思いつつスルーしたやつだ……! むしろよく Wifi が繋がっていましたね。

アンテナを付けるとペアリング・接続に成功し、イヤホンから音が出るようになりました。いいぞ〜〜

Bluetooth 接続のポップアップを自動消去したい

TODO

便利な TUI と i3blocks

  • bluetuith
    ちょっと使いづらいので他のツールを探したいです。
  • bluetooth-manager (blueman)
    たぶん良さそう。この手のアプリを 1 つのウィンドウに集約したいが……
  • i3blocks-contrib の bluetooth 関連を見てみたい

Airpods Pro はやっぱり繋がらないのだが

背面にペアリングボタンがありました。繋がりました!

さてノイズキャンセリングを無効化するには……

TODO

音声関連の TUI / GUI

pavucontrol の UI が使いにくいので他のツールを探したいです。全然課金しても良いです。 DE を使った方が賢い気はしますが。

TODO. 案外 rofi?

toyboot4etoyboot4e

fcitx5fcitx5-mozc に移行したい

fcitx5 なら Kitty で日本語入力できると聞いて!

そもそも fcitx とは、 mozc との関係は

fcitx 4, 5 の違いは

違いは分かりませんが、 4 はメンテナンスモードで 5 が開発中?

fcitx5 を有効化するには

Fcitx5 - NixOS Wiki を見る限り、 home-manager 経由で設定した方が良さそうです。

実際 configuraiton.nix から fcitx5 を有効化しても、 fcitx5-configtool 起動時にCannot connect to Fcitx by DBus, is Fcitx running? と出ました。謎です。

home.nix に以下を追加します:

  i18n.inputMethod = {
    enabled = "fcitx5";
    fcitx5.addons = with pkgs; [ fcitx5-mozc fcitx5-gtk ];
  };

これで fcitx5-configtool を起動すると、 IME の mozc を選択できました。めでたしめでたし……

とはならず、日本語入力が有効化されません。 ~/.nix-profile/lib/mozc/mozc_tool を起動するも 255 を返してエラー。参りました。。

fcitx5-migrator を起動すると、 fcitx (fcitx4) の設定を引き継いでくれた?みたいで、日本語入力ができるようになりました! ただし Firefox 限定です。 Emacs, qutebrowser はもちろん、 Kitty で日本語がしたい……!

環境変数の設定

QT_IM_MODULE=fcitx qutebrowser で起動すると IME が動きました……! home-managerfcitx5.nix を見て、環境変数の設定は問題無いと思っていましたが、そういえば home.sessionVariables はシェルの入れ方によっては効かないですね……!

programs.<shell>.enable = true; にすると、 NixOS がシェルの設定ファイルを作ろうとします。まだ Nix に dotfiles を管理させる気は無いので、シェルの RC ファイルからセッション変数を読む形に変更してみます。

.bashrc
if [ -f "$HOME/.nix-profile/etc/profile.d/hm-session-vars.sh" ] ; then
    source "$HOME/.nix-profile/etc/profile.d/hm-session-vars.sh" 
fi
config.fish
if test -f "$HOME/.nix-profile/etc/profile.d/hm-session-vars.sh"
    # source `export=..` statements in the sh file:
    for kv in (cat "$HOME/.nix-profile/etc/profile.d/hm-session-vars.sh" | grep '^export' | sed 's;^export ;;g')
        set k (printf '%s' "$kv" | cut -d '=' -f1)
        set v (printf '%s' "$kv" | cut -d '=' -f2 -| tr -d '"')
	set "$k" "$v"
    end
end

が、 fcitx5 有効化ならず。 うーむ……

configuration.nix の方の sessionVariables を設定してみた

これで動くようになりました:

  environment.sessionVariables = {
    GTK_IM_MODULE   = "fcitx";
    QT_IM_MODULE    = "fcitx";
    XMODIFIERS      = "@im=fcitx";
    GLFW_IM_MODULE  = "ibus";
  };

ルートユーザがアプリを起動するようになっている……? しかも fish シェルから起動するようになっている気がします。その辺りは改善の余地がありますね。

toyboot4etoyboot4e

XDG と mime type へのアプリ関連付け

XDG の環境変数

c.f. https://nixos.wiki/wiki/Environment_variables

設定ファイルパス以外にも指定があるようです:

$ echo $XDG_CONFIG_HOME 
/home/tbm/.config

$ echo $XDG_DATA_HOME
/home/tbm/.local/share

$ echo $XDG_CACHE_HOME
/home/tbm/.cache

$ #etc.

ls で覗いてみると、データとかキャッシュの方にも見慣れたアプリの名前が並んでいます。

xdg-ninja

A shell script which checks your $HOME for unwanted files and directories.

かつては $HOME 下に設定ファイルを置くツールも多かったので、設定ファイルパスのチェックをこちらで。僕は ~/.config/tmux/tmux.conf を知る機会になりました。

XDG という名前の由来

freedesktop.org はかつて X Desktop Group だったとか

xdg-utils

ファイル種別 (MIME) とアプリの関連付けを行うツール類のようです。 DE に依らない共通の CLI を提供するという認識であっているかな…

https://wiki.archlinux.jp/index.php/Xdg-utils

  • fish の openxdg-open

PDF を Evince で開く

Gnome のアプリいいですね……。 PDF を Evince で開く home-manager の設定は以下です:

https://discourse.nixos.org/t/set-default-application-for-mime-type-with-home-manager/17190/4

  xdg.mimeApps = {
    enable = true;
    associations.added = {
      "application/pdf" = ["org.gnome.Evince.desktop"];
    };
    defaultApplications = {
      "application/pdf" = ["org.gnome.Evince.desktop"];
    };
  };

実際に実行すると、 ~/.config/mimeapps.list がすでに存在するとエラーが出ました。 mv ~/.config/mimeapps.list{,.bak} 後の sudo nixos-rebuild switchで成功しました。

toyboot4etoyboot4e

壁紙を変えたいのだ!

変えたいけど Linux も NixOS も分からないのだ……。

Display manager (login manager) のオプションを使う

TODO

フックを使う

feh は画像ビューワだが壁紙表示にも利用できるとのこと。

$ feh --bg-fill /home/tbm/wallpapers/active.jpg

https://www.reddit.com/r/NixOS/comments/pdvg8x/run_feh_wallpaper_at_start/

  • services.xserver.displayManager.sessionCommands
  • i3 起動時のフックで壁紙を設定する
    これでいい気がしてきました。
toyboot4etoyboot4e

Rust 製ゲームビルドの暫定処置

今は呪文として依存 (特にリンクが必要なもの) を default.nix を書いて nix-direnv でパスに入れます。また Rust は fenix で入れ直すことになりました。 nixpkgscargo は古いし rustup install .. してもパスに入らないし謎です……

準備

Bevy のビルド設定 を持ってきます:

default.nix
{ pkgs ? import <nixpkgs> {} }:
with pkgs; mkShell rec {
  nativeBuildInputs = [
    pkg-config
    llvmPackages.bintools # To use lld linker
  ];
  buildInputs = [
    udev alsaLib vulkan-loader
    xlibsWrapper xorg.libXcursor xorg.libXrandr xorg.libXi # To use x11 feature
    libxkbcommon wayland # To use wayland feature
  ];
  LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath buildInputs;
}

また nix-shell に拘らず nix-direnv を使ってしまいます:

$ echo use nix >> .envrc
$ direnv allow

Rust-SDL2

ビルドには成功しますが、 cargo run --example demo でリンクエラー:

  = note: /nix/store/pnajkjw1fz03z1x27ski1qbx9n3hd4df-binutils-2.39/bin/ld: cannot find -lSDL2: No such file or directory

たぶん 動的リンク コンパイル時にエラーが分かるので、 lib をコピーしてきて静的リンク?? になっているかな。 nativeBuildInputsSDL2 を追加して成功します。

imgui-rs

imgui-sys でのビルドには成功しました。 imgui フォルダの下でビルドすると失敗します。何かダウンロードして curl で失敗してる……?

なぜ何をダウンロードしているのか

先程個別にビルドできた sdl2-sys が、今度はビルドに失敗しています:

error: failed to run custom build command for `sdl2-sys v0.34.5`

Caused by:
  process didn't exit successfully: `/home/tbm/ghq/github.com/imgui-rs/imgui-rs/target/debug/build/sdl2-sys-a608bed356de18d4/build-script-build` (exit status: 101)
  --- stderr
  thread 'main' panicked at 'Command 'curl' failed:   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                   Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  curl: (60) SSL certificate problem: unable to get local issuer certificate
  More details here: https://curl.se/docs/sslcerts.html

  curl failed to verify the legitimacy of the server and therefore could not
  establish a secure connection to it. To learn more about this situation and
  how to fix it, please visit the web page mentioned above.
  ', /home/tbm/.cargo/registry/src/github.com-1ecc6299db9ec823/sdl2-sys-0.34.5/build.rs:61:17

Cargo.toml 内の [workspace] クレートを個別にビルド……するまでもなく imgui-sdl2-support のビルドに失敗していることが分かります。

その Cargo.toml を見てみると、 "bundled" になっていますね。この場合、 SDL をダウンロードしてきてビルドするのでしょう:

sdl2 = { version = "0.34.5", features = ["bundled", "static-link"] }

そういうことなら curl を動かすしかありません。しかし認証が分からない……

$ echo $SSL_CERT_FILE

$ # 空だった

認証に関するドキュメントを読むしかない

curl: (60) SSL certificate problem: unable to get local issuer certificate

https://curl.se/docs/sslcerts.html

  • SSL: secure sckets layer は今日では TLS と呼ばれる
  • TLS: transport layer security
  • local issuer certificate: ?

いや、同じ人がいる

https://github.com/NixOS/nixpkgs/issues/3382#issuecomment-671061078

そして以下だと一応ビルドできました:

$ CURL_CA_BUNDLE=/etc/ssl/certs/ca-bundle.crt cargo build

いや〜……分からないことが多すぎる。 Local cert の件を調べて、環境変数を設定するのが適切なら curl 自体の derication の設定を変えたらいいかな……

imgui-examples の実行

OpenGL が無いとか:

thread 'main' panicked at 'Failed to initialize display: GlutinCreationError(CreationErrors([NotSupported("lacking either libGL or libEGL so could not fallback to other"), NotSupported("both libGL and libEGL are not present")]))', imgui-examples/examples/support/mod.rs:34:53

libGLglmbuildInputs に追加してビルドできました。つまり……?

そもそも Rust の環境構築

rustup で最新の rust-analyzer を入れたいけれど、 nixpkgscargo で入れると Path に入らず……

shell.nix を書く編 (なし)

まだ nix-shell が分からないので飛ばしました。そろそろ NixOS Manual を読まなければ、にっちもさっちも行きませんね。切実です。

グローバルなインストール編

Nix のサンドボックス? 機能が協力で、とても脱獄できません:

  • curl .. | sh: 失敗
  • rustup だけ nixpkgs からインストール: 失敗
    rustup component add *~/.cargo/bin 以外の不明な場所に行きます
  • rust-analyzer などすべて nixpkgs からインストール: 失敗
    rust-src が見つからない

結局 fenix でビルド環境・エディタ環境を構築できました。とにかく動かしたかったので感謝……!

toyboot4etoyboot4e

fzf で CLI アプリを作る

まともな fzf コマンドを自分で組むのは初めてです。

備考: fzf の代案

Vim とか Emacs も使える気はしますが、 fzf の方が簡単そうなので fzf を使います。

mount / unmount

fzf でパーティションを選んで……

m キーでマウント、 u キーでアンマウントができます:

内部実装はやや苦しいです。

  • サブシェルに関数を渡すため環境変数を使います。エスケープ地獄!
  • execute 内部で選ばれた行をパースします。
    • reload(eval $FZF_DEFAULT_COMMAND) でリスト更新
    • xargs よりもコマンド置換を使いたいですが……? (eval なら通りそう?)
    • {}{q} の違いは……?
_udisk2() {
    FZF_DEFAULT_COMMAND="
        lsblk -l | tail -n +2 | grep part |
            grep -v '^[/| ]' |
    	    grep -v 'SWAP' |
    	    grep -v '/boot' |
    	    grep -v '/nix/store'
    "

    _RUN="echo '{}' | cut -f1 -d' ' | xargs -I::"

    header="$(printf '%s\n%s' \
	"$(lsblk -l | sed -n 1p)" \
        '    Press \`m\` for mount, \`u\` for unmount' \
    )"

    fzf --reverse --header "$header" \
	--bind "m:execute-silent@$_RUN udisksctl mount   -b '/dev/::'@+reload(eval $FZF_DEFAULT_COMMAND)" \
	--bind "u:execute-silent@$_RUN udisksctl unmount -b '/dev/::'@+reload(eval $FZF_DEFAULT_COMMAND)"
}

TODOs

  • アルバム再生
    音楽再生 daemon (サービス?)か何かにコマンドを飛ばせば良いはずです。
  • Bluetooth
    rofi で出したいような気もしてきました
  • i3blocks
    カレンダーと同様に、 CLI ツールをウィンドウ表示したいです
toyboot4etoyboot4e

#!/usr/bin/env bash -euE は macOS でしか動かない気がする

Linux では shebang でコマンド + 1 つの引数しか指定できないらしい? ので、 bash -euE というコマンドを探すはずです。 #!/bin/bash -euE なら動きますね。 (NixOS には /bin/bash はありませんが )

toyboot4etoyboot4e

ハイスペック PC は 1 日を 24.5 時間にしてくれる

※ 過言です

toyboot4etoyboot4e

メモリ使用量 51 GB, 56 GB.. 馬鹿な、まだ止まらないのか!?

Emacs が暴走していました。 LSP の暴走かもですが、 mac でもこれがあって結構困ったのですよね。

TODO: プロセス監視

CPU 使用率やメモリ使用量を監視したいです。 i3blocks-contrib で全体量は見れますが、プロセスごとに表示したいです。

toyboot4etoyboot4e

Emacs くん見直し

クリップボード (-nw, X11, Kitty)

xclip-mode? TODO

フォントのずれ調整 (GUI)

せっかくの org-mode が! 日本語フォントを大きくすることで解決しましたが、英字に比べて大きすぎるので調整方法を探しています:

    (setq face-font-rescale-alist
          '(("Noto Sans Mono CJK JP" . 1.25)))
toyboot4etoyboot4e

NixOS の generation に関して

Git ほど便利ではないですね。

また rollback した場合、新しい世代番号を作ると、世代の親子関係がブート画面で分からなくなる問題もあります (確か) 。実用上は環境を壊してしまった直後に戻せるというだけで十分ですが。

toyboot4etoyboot4e

AtCoder 用の Haskell 環境構築

nixpkgs における Haskell

home-manager で入れた stack で --resolver lts-16.11 な stack script を実行してエラー:

~/d/h/a/abc268 ❯❯❯ ./a/Main.hs                                                                                                                                                                                                      ✘ 1 main ✱ ◼
error: attribute 'ghc883' missing

       at «string»:1:43:

            1| with (import <nixpkgs> {}); let inputs = [haskell.compiler.ghc883 git gcc gmp]; libPath = lib.makeLibraryPath inputs; stackExtraArgs = lib.concatMap (pkg: [ ''--extra-lib-dirs=${lib.getLib pkg}/lib''   ''--extra-include-dirs=${lib.getDev pkg}/include'' ]) inputs; in runCommand ''myEnv'' { buildInputs = lib.optional stdenv.isLinux glibcLocales ++ inputs; STACK_PLATFORM_VARIANT=''nix''; STACK_IN_NIX_SHELL=1; LD_LIBRARY_PATH = libPath;STACK_IN_NIX_EXTRA_ARGS = stackExtraArgs; LANG="en_US.UTF-8";} ""
             |                                           ^
       Did you mean one of ghc88, ghc884, ghc810 or ghc943?
(use '--show-trace' to show detailed location information)
  • GHC 8.8.3 が nixpkgs には無い気がします (8.8.4 はありますが)
  • パッケージも nixpkgs 経由で取ってくる形になる?

Nix intergration は未確認

3 種類あるらしいですね
https://qiita.com/junjihashimoto@github/items/8ce130e2db394918c1ea

ghcup は無理でした

脱獄編

自前ビルド + direnvnixpkgs からの脱出を測ります。

エディタ環境

  • GHC 8.8.3: ghcs-nix でビルドします
  • haskell-laungage-server: こちらは公式の Releases に prebuilt binary あったような
  • stack: 公式の Releases に prebuilt binary あったような

cabal (cabal-install) には NixOS で利用できる prebuild binary がありません。不要だった木はしますが、一応 cabal を自分でビルドしてみます:

$ cabal update # stackage 更新
$ cabal v2-build cabal

zlib のビルドに失敗しました (これは何だろう) 。パッケージの zlib を入れてもダメです。 nix-shell -p zlib からのビルドには成功しました。ライブラリを使うとこういうことがよくあります。まだまだ NixOS の謎は多い……

$ cp dist-newstyle/build/x86_64-linux/ghc-9.0.2/cabal-install-3.9.0.0/x/cabal/build/cabal/cabal /home/tbm/dev/hs/__atcoder/bin/

実行環境

Stack script の --resolverlts-16.31 にすれば動きます。テストだけ GHC 8.8.4 を使えば良かろうなのだ?!

もう動けばそれでいいやとなってます。。

その他ツール類

  • atcoder-cli
    グローバルインストールは失敗しますが、ローカルインストールはできました (npm install atcoder-cli) 。
  • online-judge-tools
    なぜか nixpkgs にあるので入れられます。助かる〜〜
toyboot4etoyboot4e

.desktop ファイルを作って自作 TUI を drun に表示

rofi -show drun で出てくるのは .desktop ファイルの一覧です。たぶん。

Fallout New Vegas.desktop を探せ

見つけた! Steam 製ゲームの起動ファイル? なのであまり参考になりませんでした。

$ ls ~/.local/share/applications

ranger.desktop を探せ

見つけた! これをコピーして自分のアプリの .desktop ファイルを作ります。

$ fd ranger.desktop /run/current-system/sw/

/run/current-system とは

/usr みたいなものらしい! そもそも /usr とは……

i3 で floating terminal として kitty 召喚

一応動きます。できればモニタの大きさに対する比率で大きさ指定したいですが:

bindsym $mod+Shift+Return exec kitty --class=floating-kitty
for_window [class="^floating-kitty$"] floating enable, resize set 1920 1080, move position center

fzf が思い通りに動かんぬ……!

どうした……!! TODO

toyboot4etoyboot4e

RPATH, or why lld doesn't work on NixOS - matklad など

Asciidoctor, djot, once-cell, rust-analyzer 関連の小ツールなど、 matklad 氏は目の付け所が良く文章が良く声も良くセンスの塊です。当然 NixOS も氏の圏内に入っている……というより僕が氏の影響で NixOS を使い始めたわけで、ナードの心象風景に浮かび上がってくる人物として今日も日輪の輝きをオメガエミッツ!

WIP

ブログを Kindle Scribe に入れて宙に吊っておくとページが進みます。 Linker を LD から LLD に変えるとリンクに失敗する原因を突き止める記事ですね。

  • pkg-config: C ライブラリの名前を受け取って -L/path/to/library を返します
    • -L って gcc とか cc への引数なのか、結局そのまま linker に渡されるのか……?
  • /usr/lib: 動的ライブラリ (.so on Linux, .dylib on macOS) の置き場
  • LD_LIBRARY_PATH: TODO (動的ライブラリのパスのコレクションで linker が探してくれる?)
  • Runtime loader = dynamic linker (実行時に動的ライブラリを見つけて来てリンクする)
    • ld とか lld は static linker かつ dynamic linker なのだろうか
  • ELF: Executable and Linking Format つまり現代的な実行ファイルのフォーマット? RPATH を含む
  • RPATH: runpath か (動的ライブラリを探すために実行ファイルに関連づけられた path か)
  • readelf -d: ELF の RPATH を読むのに使える?
  • RPATH はコンパイル時に linker への -rpath /nix/store/.. のような引数で設定される
  • NixOS の ldld の wrapper であり、 -L 引数で渡されたライブラリをすべて実行ファイルの RPATH に埋め込む (c.f. cat (which ld))
  • pkgs.lld はラップされていないが pkgs.llvmPackages.bintools はラップされている
  • 〜完〜 ( えっ?)

TODO

  • nativeBuildInput は何をするのか、普通のパッケージとはどう違うか
  • .pc ファイルというのが pkg-config に情報提供する (wiki より)
  • pkg-config on NixOS
  • GLib とは。よく Go で問題になっている気がするけれど

疑問点

  • NixOS でビルドしたバイナリは他の OS で動的リンクして動くのだろうか
  • 他の OS で (略
  • stream-run
toyboot4etoyboot4e

xdotool で drop-down 某、の準備

i3sxhkd を併用する

i3scratchpad が何かとバグっている気がする

なぜか全く動かなくなった……

xdotool をターミナルから打つと成功

スクリプトの内容は理解していないですが:

https://www.youtube.com/watch?v=su5cqjVYFcs

i3/config からの bindsym は失敗

このスクリプトへの bindsym は動きませんでした。 --release も付けたのですがダメです。

sxhkd を使用するには

sxhkd 経由からの xdotool 系スクリプト呼び出しは動きます。

サービスとして使用する (失敗)

home-manager の方の services.sxhkd.enable = true; を有効化しました。

問題 1. config ファイルが干渉する

Feb 26 16:37:31 nixos hm-activate-tbm[996749]: Existing file '/home/tbm/.config/sxhkd/sxhkdrc' is in the way of '/nix/store/667j50dkai66sx6kafj909p5sk8ww076-home-manager-files/.config/sxhkd/sxhkdrc'
Feb 26 16:37:31 nixos hm-activate-tbm[996749]: Please move the above files and try again or use 'home-manager switch -b backup' to back up existing files automatically.

ならば設定ファイルの上書きを無効化します:

    xdg.configFile."sxhkd/sxhkdrc".enable = false;

問題 2. configFile.<name>.enable が無いと出ます。

error: The option `home-manager.users.tbm.xdg.configFile."sxhkd/sxhkdrc".enable' does not exist. Definition values:
       - In `/etc/nixos/configuration.nix': false

他の人の環境では問題なく動くご様子 (ありがたい情報!) 。僕の環境で動かないのは謎です……

パッケージの sxhkd を使用する

この場合 systemd から起動されません。

sxhkd の使い方

コンフィグの再読み込み:

pkill -USR1 -x sxhkd

i3 の方の設定を追加します:

# reload the configuration file (both `i3` and `sxhkd`)
bindsym $mod+Shift+c reload ; exec "pkill -USR1 -x sxhkd"

詳しくはスレッドで。

toyboot4etoyboot4e

xdotool で drop-down 某

元ネタ: https://www.youtube.com/watch?v=su5cqjVYFcs

スクリプト

`x11-pad` コマンド
#!/usr/bin/env bash

set -euE

# X11 scratchpad
# Thanks: https://github.com/jdpedersen1/scripts/blob/main/scratch

# TODO: `--class` or `--title`
matcher="$2"
oninit="$3"

if [ "$1" == "--class" ] ; then
  xdotool search --onlyvisible --class "$matcher" windowunmap \
      || xdotool search --class "$matcher" windowmap \
      || $oninit &

elif [ "$1" == "--title" ] ; then
  xdotool search --onlyvisible --name "$matcher" windowunmap \
      || xdotool search --name "$matcher" windowmap \
      || $oninit &

else
  echo "unknown arg1" 1>&2
fi

収納・取り出し可能な floating window の作成

i3 における floating window 設定:

for_window [class="dropdown-terminal"] floating enable, resize set 1920 1080, move position center

sxhkd における floating window の呼び出し・収納

super + shift + Return
  x11-pad --class 'dropdown-terminal' ' kitty --class="dropdown-terminal"'

他のアプリの同様に追加可能です

Emacs や各種アプリを登録していきます。 Dock は無いですが、ほぼ mac 環境に匹敵してきました。

toyboot4etoyboot4e

Nix Flakes エアプ

Niv というのもあるそうですが、ひとまず Flakes を見ていきます。

Summary of Nix Flakes vs original Nix

完全に意訳/自分専用メモですが

  • Flakes は良い点と議論を呼ぶ点を一気にもたらす
  • 良いとされる点
    • Nix だとプロジェクトの作り方が多数あるのに対し、 Flakes を使うと必ず flakes.nix を配置した同じ形のプロジェクトになる
    • flakes.lock で自動的に依存パッケージのバージョンをロックできる
    • Flakes は時間や現環境?に依存したコードをデフォルトで禁止する
    • キャッシュ
    • nix flakes という CLI
  • 議論を呼ぶ点
    • nixpkgs 1 箇所に力を注いで欲しい
    • recurceIntoAttrs was lost?
    • flake.nix は出力部分以外で関数呼び出しができない (データしか書けない)
    • flakes-utils 無しだと flakes の出力が?読みづらい
    • Git を前提とする
    • 開発中はキャッシュが意味を成さないことが多い
    • System tuples are hard-coded with Flakes

Building Nix flakes from Rust workspaces - Tweag

WIP

toyboot4etoyboot4e

NixOS unstable channel へ

モチベーション

  • Kernel 更新
    neofetch によると、僕は Linux Kernel 5.15.90 を使っています。 6 に移動してみたいです。

  • なぜか動かない機能がある
    また僕の環境 (nixpkgs 22.11) では home-manager に以下設定が無いらしいのですが、 unstable channel なら動くかもと思います。

  xdg.configFile."sxhkd/sxhkdrc".enable = false;

すべての世代を列挙する

https://github.com/NixOS/nixpkgs/issues/24374#issuecomment-554459278

$ sudo nix-env --list-generations --profile /nix/var/nix/profiles/system

現在は 120 世代でした。更新に失敗したら、ブートローダ?から 120 世代を選べば巻き戻せます。安心感があります。

Manual に従って更新

https://nixos.org/manual/nixos/stable/index.html#sec-upgrading

$ sudo nix-channel --add https://nixos.org/channels/nixos-unstable nixos
$ sudo nix-channel --add https://github.com/nix-community/home-manager/archive/master.tar.gz home-manager
$ # sudo nix-channel --add https://nixos.org/channels/nixos-22.11 stable
$ sudo nix-channel --update
$ sudo nixos-rebuild switch --upgrade
$ reboot

何らかのパッケージが Python 2.7 に依存しているそうですが、強行突破してしまいました。さあ問題なく起動してくれるでしょうか。

結果

特に問題なく動いていますね。

  • sxhkd
    サービスとして利用時に xdg.configFile."sxhkd/sxhkdrc".enable = false; が使えるようになりました。

  • Haskell
    haskell-language-server 1.9.0 は GHC 8 をサポートしていなかったので、 shell.nix では 22.11 に相当する stable channel を使っています。

  • qutebrowser
    コンソールとサイドバーの日本語フォントがガビガビになりました。なんとかフォント指定をなおしたいですが……

  • Discord
    相変わらず日本語を表示できない悲しい状況です。どう直せば……

toyboot4etoyboot4e

残件

以下を片付けてスクラップを閉じます。

  • IME

  • デバイス関連

    • Discord でも日本語フォントを表示してほしい
      バージョンアップだけで直った?
    • Airpods Pro との接続が切れないようにする
    • Blueman や PulseAudio の快適な TUI
  • サービス関連

    • USB メモリの自動マウント
    • ssh-add の自動化
  • WM 関連

    • i3 に大半のウィンドウを floating にしてもらう (主にゲームをビルドしたときのため)
    • 高 DPI のためカーソルが小さい問題の解消
    • 起動時に tmux のウィンドウ設定をレストアする
    • 起動時に i3 のウィンドウ・ワークスペースをレストアする
    • 起動時にディスプレイの設定をレストアする
  • ツール類

    • tar を快適に使う方法
  • config 関連

    • 公開リポジトリから隠しつつユーザ設定 (xrandr や壁紙設定など)
    • Nix Flakes に移行 (楽しみ!)
  • GUI ツール

    • Blender で動画編集
    • Bitwig Studio で音楽編集
このスクラップは2024/09/06にクローズされました