見出し画像

【NixOS GUI設定ツール(nixgen)】更新経過報告:8月5日→8月10日の差分

NixOS の設定項目 24,557 個とパッケージ 144,245 個を検索して、フォームに値を入れると .nix ファイルが出てくる道具、nixgen の更新報告です。

前回の更新(8月5日)から、55コミット・27ビルドぶんの変更が入りました。プルダウンが4つ増え、ファイルの受け取り方が変わり、そして静かに壊れていたバグが10件以上見つかっています。

nix run github:hatake716/nixgen

1. 「どれから触ればいいのか」に答えました

いちばん効いたのは、たぶんこれです。

起動すると画面が3つに分かれます。左がカタログ、真ん中が設定、右が出来上がっていくファイル。ところがどこから手を付けるのかが、どこにも書いていませんでした。

いまは画面中央に5つの手順が出ます。しかもそれは、タブの並びそのものです。

  1. Setup — マシンそのもの。ホスト名、ユーザー、チャンネル、ブートローダー

  2. Options — 設定項目

  3. Packages — ソフトウェア

  4. Check syntax — 指摘が出たら直す

  5. Download all three — 展開して dry-build、問題が無ければ切り替え

以前も5ステップは出ていたのですが、内容ごとの分類でした。「既存ファイルの読み込み」が途中に独立した手順として挟まっていて、読めば分かるけれど、最初の疑問には答えていなかったわけです。いまは読み込みは手順1の分岐に、確認(Check syntax)は独立した手順に移しました。

README とホームページも同じ順序に並べ替えてあります。README は節が内容ごとに並んでいたため、アプリが最初に開く Setup タブの説明が8番目にありました。読む順と使う順が逆だったことになります。


2. プルダウンが4つ

Options タブに、選ぶだけで設定が入るプルダウンを並べました。カーネル → デスクトップ → グラフィックス → 言語の順です。他のすべてがその上で動くものを先頭に置いています。

カーネル

標準・最新・LTS・Zen の4つ。書き込まれるのは boot.kernelPackages です。

作っていて分かったのですが、nixpkgs に linuxPackages_lts は存在しません。あると思って書いていたら、そのまま壊れたファイルが出ていました。LTS は系列(6.12、6.6、6.1…)を新しい順に並べておいて、そのチャンネルが今も持っている最初のものを採用しています。選ぶと linux 6.12.102 のように採用したバージョンが表示されるので、どの系列なのかを推測せずに済みます。

デスクトップ

GNOME・KDE Plasma・Xfce に加えて、Cinnamon と COSMIC を追加しました。

面白いのは COSMIC だけ設定が2項目だという点です。他は「Xサーバー・ログイン画面・デスクトップ本体」の3項目ですが、COSMIC は Wayland なので有効にするXサーバーが存在せず、ログイン画面も自前のものを持っています。ここで揃えて services.xserver.enable を足すと、誰も使わないXサーバーをビルドすることになります。

グラフィックス

AMD・Intel・NVIDIA。どれも hardware.graphics と32bit側(Steam や wine に必要)を有効にしたうえで、そのカードに実際に必要なことだけをします。

Intel には VAAPI ドライバを足します(無いと動画のハードウェアデコードが働きません)。AMD は何も足しません(mesa が持っています)。services.xserver.videoDrivers を書くのは NVIDIA だけで、これは手抜きではなく、既定の modesetting が現行カーネルの AMD と Intel では正解だからです。

言語

英語・日本語・フランス語・ドイツ語・スペイン語・韓国語・中国語。選ぶだけで、ロケール・コンソールのキーマップ・Xのレイアウトが入り、CJK の3言語では入力メソッド(fcitx5 と対応エンジン)も設定されます。

フォントは入れていません。必要ないからです。5つのデスクトップはいずれも CJK フォントと絵文字フォントを既に持っています。これは記憶ではなく、実際に評価済みのシステムを読んで確認しました。


3. よく使うアプリを、分野から選べます

Packages タブに Common apps を追加しました。12分野・183パッケージです。

Web browsers — ブラウザ          Chat and sync — チャット・同期
Mail — メーラー                  Accessories — アクセサリー
Office — オフィスソフト          File managers — ファイラー
Audio and video — マルチメディア  Terminals — ターミナル
Graphics — グラフィックス        System tools — システムツール
Games — ゲーム                   Development — 開発

5つのデスクトップの標準アプリも入っています。二重にインストールするためではありません(デスクトップを有効にすれば標準アプリは既に入ります)。そのデスクトップを使わずにアプリだけ取れるようにするためです。GNOME で cosmic-term を使う、Xfce で gwenview を使う、といった場合ですね。

どのアプリが標準なのかは、素のシステムと、そのデスクトップを有効にしたシステムを実際に評価して差分を取りました。 Cinnamon は90個、COSMIC は60個を追加します。そこからセッション・テーマ・各種サービスを除いた結果が一覧に入っています。

この作業で分かったこと:

  • kwrite には独立した属性がありません(nixpkgs では kate に同梱)

  • kdenlive の実体は kdePackages.kdenlive、0ad は zeroad

  • superTuxKart は 25.11 と 26.05 の間に supertuxkart へ改名された

そのため名前は必ずカタログで照合しています。そのチャンネルに無い名前は、壊れた形で提示されるのではなく、単に一覧に出ません。

一方で入れなかったものもあります。cosmic-settings や mint のテーマ類は、そのデスクトップが動いていなければ意味がありません。個人の設定ファイルから採るときも、GPU 関連やマイクロコード、手書きの callPackage 式は外しました。「他人のマシンでも欲しいか」が基準です。


4. 3つのファイルを、1つで受け取れます

これまでは、出来上がったファイルをファイルタブで切り替えて1つずつダウンロードする必要がありました。いまは Download all three を押すと、configuration.nix・flake.nix・generated.nix が1つの .tar.gz で出てきます。

tar -xzf desktop.tar.gz

.zip ではなく .tar.gz なのは、受け取る側の事情です。NixOS には tar と gzip が最初から入っていますが、unzip は入っていません。 zip にすると、落としたものを開く前にパッケージを探しに行かせることになります。

中身はホスト名のディレクトリに入っています。展開する場所は人それぞれなので、平置きだとそこにある configuration.nix を上書きしかねません。hardware-configuration.nix は含みません。そのマシンのディスク構成を書いたファイルで、nixgen が書いたことは一度もありません。

なお、同じ3ファイルからは常に同一のバイト列が出ます(更新時刻とモードを固定)。2回落として差分を取れば、中身が違う箇所だけが出ます。


5. unstable に対応しました(ただし安定版パッケージと混在はできません)

nixos-unstable を、番号付きリリースと同じように選べるようになりました。ただし選んだら全部 unstable になります。 オプションもパッケージも flake.nix も system.stateVersion もです。

「パッケージだけ unstable から」はできませんし、対応する予定もありません。 パッケージはオーバーレイで持って来られますが、オプションはそうはいきません。unstable の services.foo.* には unstable のモジュール一式が要ります。半分だけ選べるカタログは、対応していないより悪いというのが結論です。

対応に必要だったのは機能より情報でした。オプション一覧がいつ公開されたものかを表示し、古くなったら再構築を提案する。これが無いと、フォームは実在しないオプションを提示し、構文チェックも通り、nixos-rebuild で初めて落ちます。unstable を長く非対応にしていた本当の理由はこれでした。

あわせて flake.nix がブランチとコミットのどちらを指すかも選べるようにしました。既定はブランチです。コミット固定のほうが正確(画面に出ていたオプションと実際にビルドされる木が一致する)なのですが、決して動かない既定値は、設定を変えない限りセキュリティ更新が届かないということでもあります。


6. 静かに壊れていたバグたち

ここからが本題かもしれません。今回いちばん時間を使ったのは、動いているように見えて壊れているものの発見でした。

パッケージ名に pkgs. が付かない。 検索から python313Packages.requests を選ぶと、pkgs. 無しで書き出され、nixos-rebuild が undefined variable 'python313Packages' で止まっていました。「名前にドットがあるなら既に修飾済み」という判定が原因です。カタログの83%が名前にドットを含みます。 よく使うもの(firefox、git、ripgrep)にドットが無いので、気づかれずにいました。

適用できるのに、何も起きない設定。 boot.kernel.sysctl."net.core.rmem_max" が引用符の中のドットで分割され、別の属性に書き込まれていました。 ファイルは構文チェックを通り、nixos-rebuild も受け付け、設定だけが効きません。この形の項目は76個あります。エラーが出ない不具合は、いちばん見つけにくい部類です。

日本語 や Grüße が文字化けする。 エスケープ解除に Python の unicode_escape を使っていたためです。これは UTF-8 のバイト列を latin-1 として読みます。

services.foo.nice = -5 が __sub 0 5 になる。 Nix に負数リテラルは無いので、パーサーはこの形で返してきます。値としては正しいのですが、自分が書いた行だと気づけません。

[ -1 ] が構文エラーになる。 Nix ではリスト内の負数に括弧が要ります([ (-1) ])。読み込み側が括弧を外していました。

このほか、空のパッケージ一覧に追加できない、引用符を含むパッケージ名がリストごと壊れる、狭い画面でページ全体が横スクロールする、プルダウンの日本語が枠から切れて見えない、といったものを直しています。


7. 「見た目が正しい」を信用しない

上のようなバグが続いたので、確かめ方のほうを整えました。

  • 読み込み側にテストハーネスを新設。 初回実行で6件見つかりました。Nix のパーサーを使う経路と、Nix が無い環境用のフォールバックの両方を通します。この2つは壊れ方が違い、6件のうち3件は片方でしか出ませんでした。

  • プルダウンの設定は、構文解析では確認しません。 「そのオプションが実在するか」も「設定が効いているか」も分からないからです。カーネル4種もデスクトップ5種も、索引と同じリビジョンで実際の NixOS システムとして評価し、狙ったカーネル・狙ったセッションが出ること、システム派生が別物になること(=黙って無視されていないこと)まで見ています。

  • チェックは push のたびに自動実行。 ローカルの手順と CI が同じシェルで同じコマンドを走らせます。

  • スクリーンショットの撮り直しをコマンド化。 手作業だったので3世代ぶん古くなっていました。実際のアプリを操作して撮ります。


8. 日本語表示のこと

ブラウザの翻訳機能で見たときに、分野名がおかしいという問題がありました。Audio and video が「音楽と動画」と訳される。中身は audacity や pavucontrol で、音楽の話ではありません。

機械翻訳が最も苦手とするのが、こういう分野名です。 そこで全プルダウンの選択肢を Audio and video — マルチメディア の形で併記し、翻訳機能に書き換えられないよう固定しました。40項目あります。

やってみると、閉じた状態のプルダウンは収まらない部分を黙って切り捨てることが分かりました。切り捨てられるのは後半、つまり日本語の側です。翻訳して読んでいる人がいちばん頼る部分ですね。目視ではなく実測して、40項目すべてが枠に収まるまで文言を詰めました。

画面中央の使い方も英語と日本語の二段にしました。翻訳ではなく書き下ろしです。各ステップはタブやボタンの名前を指しているので、機械翻訳にかけると画面のどこにも無い名前を指すことになるからです。

ついでに気づいたのが、日本語の途中の改行はスペースとして描画されるということ。ホームページの日本語は英文と同じ感覚で折り返されていて、35箇所に空白が出ていました。 ソースを読んでも気づけません。描画して初めて見えます。


おわりに

まとめると、8月5日からの差分はこうなります。

ベータ版です。作者の環境と仮想マシンでは動いていますが、それ以外で何が起きるかは分かっていません。適用する前に sudo nixos-rebuild dry-build で必ず確認してください。

nix run github:hatake716/nixgen

続きはこちら

関連記事はこちら


いいなと思ったら応援しよう!

はたけっち|テック&ガジェット雑学 よろしければ応援お願いします! いただいたチップはクリエイターとしての活動費に使わせていただきます!