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

Linux デスクトップに慣れたい
インストール・初期設定
下記スクラップで実施しました:
現環境
NixOS で i3wm を使っています。 WM は快適ですが、基本機能が普通の DE に及ばない状態です。開発もおぼつきません。ここから Linux の基本要素や Nix の醍醐味を見つけていくつもりです。
縛り
基本質問無しで行きます。ナード面ではインテリになりたいので……
脳内
今 Linux 関連の名詞が頭の中でごった煮になっています。 kernel, daemon, service, wayland, x11, systemd, systemctl, dbus, ibus, fcitx, blueman, RPATH, pkg-config, etc. 少しずつ全体像を掴めていけたらと思います。
手持ちの本
-
CentOS 7 構築・運用・管理パーフェクトガイド (※ 古い)
ドンピシャの情報ではない気はしますが、手当たりしだいに読んだほうが良さそうです。 -
Linux の仕組み (第二版がほしい)
低レイヤ過ぎてちょっと違う気がします。 -
はじめてのOSコードリーディング
同上。 -
How Linux Works
翻訳はスーパーユーザーなら知っておくべきLinuxシステムの仕組み 。普段 Linux を起動したときに何が起こっているのか理解が深まるかも……? たとえば display manager と検索してもヒット 0 なので、僕が読みたいよりもかなり下のレイヤの本です。
興味のある本
- もっと上のレイヤの本がほしい

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;
-
udisksctl
の CLi について:
https://unix.stackexchange.com/questions/686838/mount-usb-drive-without-sudo -
ranger
で:mount
:
https://github.com/SL-RU/ranger_udisk_menu
udisks2
+ fzf
で TUI
下の投稿 を参照
mount
されるようにする
そもそも自動で これも udisksctl
:
rofi
や i3blocks
からマウント状況確認?
TODO

tar
のやり方が分からない
毎回 tldr tar
を引くのは手間です。拡張子やバイナリからファイル種別を自動判別して展開してくれるツールが必要です。また歴史的経緯も気になります。
そもそも自動で展開してくれる?
TODO
アーカイブ化と圧縮について
TODO
ツール探し
TODO

IME がブラウザで頻繁に死ぬ?
TODO. fcitx?

Blender で動画編集、だと……!
だとだと……!
まずインストール
起動時点で動画編集がメイン機能のように輝いています。 Out-of-the-box で使えそうです。
軽量エディタとして使ってみる
軽量じゃないかもですが。。
- トリミングをやってみる
- 解像度変更
- GIF 出力
音声編集に使ってみる
- ノイズ除去?
- 音圧調整?
ガッツリ編集に使ってみる
- ゲーム紹介動画 (まずゲームを作れとなりますが)

DE 的デスクトップ画面
Winow system, WM
-
X11 +
i3
- wayland + sway
- wayland + Hyperland
Status bar
-
i3blocks-contrib
display manager)
Login 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-dock
はnixpkgs
にはまだ無いですね
PDF viewer
- Evince (Gnome)
Video player
-
mpv
+mpv-file-browser

DE 的ツール類
結局 DE が欲しい気はしますが (mac が好きだった) 、個別のツール類を調べていきます。
-
スクリーンショット
flameshot と import -
スクリーンキャスト
OBS, TODO -
録音
TODO -
カラーピッカー
TODO -
画像再生
tmux
なしならranger
でも見れますが。 TODO -
画像編集
GIMP -
映像再生
mpv + mpv-file-browser, prev の修正スクリプト -
映像編集
Blender -
音楽再生
cmus, TODO -
音楽編集
厳しそうですが bitwig ならあるいは?

映像出力の切り替え (X)
xrandr
Xorg と 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
-
TODO: xorg における DPI とは
単に検出できていないだけの気がしますが。 -
TODO: モニタ毎の DPI 切り替え
https://blog.summercat.com/configuring-mixed-dpi-monitors-with-xrandr.html
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
がありました。 - 引数指定できる設定ファイルは基本ユーザから隠すつもりか……!
自動切り替え
-
services.xserver.displayManager.setupCommands
結局コマンド実行で画面設定をするのが最も簡単な気がしています。 -
xrandrHeads
https://discourse.nixos.org/t/proper-way-to-configure-monitors/12341
上記xorg.conf
への一役買います。が、期待通り動いてくれなくて困っています。 -
autorandr
? -
kanshi
?
未設定
新規接続のモニタに自動でつながってほしい
ディスプレイ配置の UI
arandr
?

Bluetooth よ繋がっておくれ
繋がらないのだ (・ω・) dbus?
ハードの問題ではない?
- マザーボードの仕様 を確認した限り、ハード的には対応しています
- BIOS も最新です
設定や設定方法の見直し
改めて接続を実施したところ、たまにデバイス一覧にペアリングデバイス名が出現します。ペアリングはできるものの接続できない。パソコンに近づくと繋がります。どうやら接続可能距離が極端に短いようです。
-
https://nixos.wiki/wiki/Bluetooth
やや古いですが、trust
など -
https://zenn.dev/noraworld/articles/bluetoothctl-commands
リファレンスとして。
いや付属品にアンテナがあった
改めてマザーボード 仕様 の詳細タブを見ると、 Wifi Anntena が付属品にありました。お化粧品みたいだなーと思いつつスルーしたやつだ……! むしろよく Wifi が繋がっていましたね。
アンテナを付けるとペアリング・接続に成功し、イヤホンから音が出るようになりました。いいぞ〜〜
Bluetooth 接続のポップアップを自動消去したい
TODO
i3blocks
便利な TUI と -
bluetuith
ちょっと使いづらいので他のツールを探したいです。 -
bluetooth-manager
(blueman
)
たぶん良さそう。この手のアプリを 1 つのウィンドウに集約したいが…… -
i3blocks-contrib
の bluetooth 関連を見てみたい
Airpods Pro はやっぱり繋がらないのだが
背面にペアリングボタンがありました。繋がりました!
さてノイズキャンセリングを無効化するには……
TODO
音声関連の TUI / GUI
pavucontrol
の UI が使いにくいので他のツールを探したいです。全然課金しても良いです。 DE を使った方が賢い気はしますが。
TODO. 案外 rofi
?

fcitx5
と fcitx5-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-manager
の fcitx5.nix を見て、環境変数の設定は問題無いと思っていましたが、そういえば home.sessionVariables はシェルの入れ方によっては効かないですね……!
programs.<shell>.enable = true;
にすると、 NixOS がシェルの設定ファイルを作ろうとします。まだ Nix に dotfiles を管理させる気は無いので、シェルの RC ファイルからセッション変数を読む形に変更してみます。
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
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
シェルから起動するようになっている気がします。その辺りは改善の余地がありますね。

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 の open は
xdg-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
で成功しました。

壁紙を変えたいのだ!
変えたいけど Linux も NixOS も分からないのだ……。
Display manager (login manager) のオプションを使う
- LightDM の background オプションを頑張って設定する
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
起動時のフックで壁紙を設定する
これでいい気がしてきました。

Rust 製ゲームビルドの暫定処置
今は呪文として依存 (特にリンクが必要なもの) を default.nix
を書いて nix-direnv
でパスに入れます。また Rust は fenix で入れ直すことになりました。 nixpkgs
の cargo
は古いし 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 をコピーしてきて静的リンク?? になっているかな。 nativeBuildInputs
に SDL2
を追加して成功します。
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
libGL
と glm
を buildInputs
に追加してビルドできました。つまり……?
そもそも Rust の環境構築
rustup
で最新の rust-analyzer
を入れたいけれど、 nixpkgs
の cargo
で入れると Path に入らず……
shell.nix
を書く編 (なし)
まだ nix-shell
が分からないので飛ばしました。そろそろ NixOS Manual を読まなければ、にっちもさっちも行きませんね。切実です。
グローバルなインストール編
Nix のサンドボックス? 機能が協力で、とても脱獄できません:
-
curl .. | sh
: 失敗 -
rustup
だけnixpkgs
からインストール: 失敗
rustup component add *
が~/.cargo/bin
以外の不明な場所に行きます -
rust-analyzer
などすべてnixpkgs
からインストール: 失敗
rust-src
が見つからない
結局 fenix
でビルド環境・エディタ環境を構築できました。とにかく動かしたかったので感謝……!

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 ツールをウィンドウ表示したいです

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

env -S
なら Linux でも shebang 中のコマンドを単語分解できる
知らなんだ!

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

メモリ使用量 51 GB, 56 GB.. 馬鹿な、まだ止まらないのか!?
Emacs が暴走していました。 LSP の暴走かもですが、 mac でもこれがあって結構困ったのですよね。
TODO: プロセス監視
CPU 使用率やメモリ使用量を監視したいです。 i3blocks-contrib
で全体量は見れますが、プロセスごとに表示したいです。

Emacs くん見直し
-nw
, X11, Kitty)
クリップボード (xclip-mode? TODO
フォントのずれ調整 (GUI)
せっかくの org-mode
が! 日本語フォントを大きくすることで解決しましたが、英字に比べて大きすぎるので調整方法を探しています:
(setq face-font-rescale-alist
'(("Noto Sans Mono CJK JP" . 1.25)))

NixOS の generation に関して
Git ほど便利ではないですね。
-
List-generations and rollback to any configuration
コマンドラインから 2 つ以上前の世代に一発で戻ることはできません。起動時には任意に選べるので良いのですが -
How to tag a generation?
No. 無念ですが番号と日時で判別します。
また rollback した場合、新しい世代番号を作ると、世代の親子関係がブート画面で分からなくなる問題もあります (確か) 。実用上は環境を壊してしまった直後に戻せるというだけで十分ですが。

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
は無理でした
脱獄編
自前ビルド + direnv
で nixpkgs
からの脱出を測ります。
エディタ環境
- 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 の --resolver
を lts-16.31
にすれば動きます。テストだけ GHC 8.8.4 を使えば良かろうなのだ?!
もう動けばそれでいいやとなってます。。
その他ツール類
-
atcoder-cli
グローバルインストールは失敗しますが、ローカルインストールはできました (npm install atcoder-cli
) 。 -
online-judge-tools
なぜかnixpkgs
にあるので入れられます。助かる〜〜

.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

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 の
ld
はld
の 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
は

xdotool で drop-down 某、の準備
i3
と sxhkd
を併用する
i3
の scratchpad
が何かとバグっている気がする
なぜか全く動かなくなった……
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"
詳しくはスレッドで。

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 環境に匹敵してきました。

Nix Flakes エアプ
Niv というのもあるそうですが、ひとまず Flakes を見ていきます。
Summary of Nix Flakes vs original Nix
完全に意訳/自分専用メモですが
- Flakes は良い点と議論を呼ぶ点を一気にもたらす
- 良いとされる点
- Nix だとプロジェクトの作り方が多数あるのに対し、 Flakes を使うと必ず
flakes.nix
を配置した同じ形のプロジェクトになる -
flakes.lock
で自動的に依存パッケージのバージョンをロックできる - Flakes は時間や現環境?に依存したコードをデフォルトで禁止する
- キャッシュ
-
nix flakes
という CLI
- Nix だとプロジェクトの作り方が多数あるのに対し、 Flakes を使うと必ず
- 議論を呼ぶ点
-
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

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
相変わらず日本語を表示できない悲しい状況です。どう直せば……

残件
以下を片付けてスクラップを閉じます。
-
IME
-
fcitx5
に 移行 -
mozc_tool
が 255 エラーを返して起動しない問題の解消
wrapQtApp
を追記してもらいました: https://github.com/NixOS/nixpkgs/issues/221958 - SKK を有効化してみる
-
-
デバイス関連
-
Discord でも日本語フォントを表示してほしい
バージョンアップだけで直った? - Airpods Pro との接続が切れないようにする
- Blueman や PulseAudio の快適な TUI
-
Discord でも日本語フォントを表示してほしい
-
サービス関連
- USB メモリの自動マウント
-
ssh-add
の自動化
-
WM 関連
-
i3
に大半のウィンドウを floating にしてもらう (主にゲームをビルドしたときのため) - 高 DPI のためカーソルが小さい問題の解消
-
起動時に
tmux
のウィンドウ設定をレストアする -
起動時に
i3
のウィンドウ・ワークスペースをレストアする - 起動時にディスプレイの設定をレストアする
-
-
ツール類
-
tar
を快適に使う方法
-
-
config 関連
-
公開リポジトリから隠しつつユーザ設定 (
xrandr
や壁紙設定など) - Nix Flakes に移行 (楽しみ!)
-
公開リポジトリから隠しつつユーザ設定 (
-
GUI ツール
- Blender で動画編集
- Bitwig Studio で音楽編集