Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
❄️ tmux-nixの実装を通して学ぶNixOSモジュール
Search
Mutsuha Asada
May 24, 2025
Programming
1.1k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
❄️ tmux-nixの実装を通して学ぶNixOSモジュール
Nix meetup #3 大阪
Mutsuha Asada
May 24, 2025
More Decks by Mutsuha Asada
See All by Mutsuha Asada
Reproducible Containers (ASPLOS'20)
momeemt
0
620
❄️ NixCon2025に参加した
momeemt
0
630
🔨 小さなビルドシステムを作る
momeemt
4
1.5k
情報科学類で学べる専門科目38選
momeemt
0
1.2k
Wasmで拡張できる軽量マークアップ言語 Brack
momeemt
0
770
❄️ NixOS/nixpkgsにSATySFiサポートを実装する
momeemt
2
1k
Intel系FPGA上へのRISC-Vプロセッサの実装
momeemt
0
630
情報科学若手の会 2024 LT「WebAssemblyで拡張可能な軽量マークアップ言語の開発」
momeemt
0
79
Nixでつくるdotfiles
momeemt
4
1.8k
Other Decks in Programming
See All in Programming
FreeBSDでZabbixを動かす
kenkino
0
320
すこし踏み込む CancellationToken
htkym
2
740
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
300
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
390
更なる可用性を求めて、5年間運用したKotlinのアプリケーションをGoでリプレイスする話
ken_tunc
0
350
手動確認はもう限界 〜XCUITestでCustom URL Schemeの遷移を起動種別ごとに自動テストする〜 / Testing Custom URL Schemes with XCUITest
otouto
0
320
IBM Bob Dojo #1 仕様駆動開発入門
oniak3ibm
PRO
0
120
Building an Out-of-Order CPU
latte72
1
790
世界の中心で、AI(App Intents)をさけぶ ー App Intents中心設計の実践ガイド
touyou
0
650
What We Talk About When We Talk About XP
m_seki
2
670
動作中のプログラムの中身をリアルタイムに覗く / Realtime Debugger for CSharp with Roslyn
prota
1
900
モジュールの視点からSwiftを読み解く #iosdc
s_shimotori
0
190
Featured
See All Featured
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
260
Believing is Seeing
oripsolob
1
220
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
8k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
120
120k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
440
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.8k
The Invisible Side of Design
smashingmag
301
52k
Google's AI Overviews - The New Search
badams
0
1.6k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
610
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.8k
Transcript
Nix meetup #3 2025.05.24 浅田睦葉 @mutsuha_asada tmux-nixの実装を通して学ぶ NixOSモジュール
🎓 所属 ・筑波大学情報学群情報科学類 B4 🐣 興味 ・コンパイラツールチェーン、LLVM、開発者体験 ・2年ほどNixOSとNixを利用している (2022/12~) ・Nix周辺への貢献
・NixOS/nix: 1 PR merged ・NixOS/nixpkgs: 36 PRs merged, 197 PRs reviewed ・NixCon2025のテーマを悩み中です 😕 自己紹介 2 @momeemt @mutsuha_asada @momee.mt https://momee.mt
概要 ・既存のtmuxでは高度なカスタマイズの際にtmux.confを書く必要がある → プラグインの設定も含めてできるだけNixに閉じたモジュールを作りたい ・具体的な実装を通じて、NixOSモジュールを学ぶことが目標です 🚩 📚 目次 1.既存のtmux向けモジュールの機能と実装 2.tmux-nixの目標
3.tmux-nixの実装 4.展望・まとめ 3
(先に) tmux-nixの紹介 4
1. 既存のtmux向けモジュールの機能と実装 5
tmuxとは① (概要) ・ターミナルマルチプレクサ(Terminal Multiplexer) ・セッション/ウィンドウ/ペインに分割することで複数のターミナルを管理できる ・単にSSH先でプロセスを維持するという目的にも使用される 6 ▲ 発表者のtmux環境 Ctrl-A
<n|p> でWindow前後を切り替えて使っている
7 tmuxとは② (ssh接続時) sshd login shell ② attach P1 ...
Pn ③ 子プロセスの作成 アクティブ ... TCP/22 PTY (slave) ① fork sshd login shell ③ closeを確認 P1 ... Pn SIGHUP 処理中のプロセスが 削除されてしまう ... ① ❌切断 PTY SIGHUP SIGHUP SIGHUP kernel SSH切断 ④ SIGHUP ② PTYをclose
8 tmuxとは③ (セッションの維持) sshd login shell ② attach tmux client
③ tmux new TCP/22 PTY (slave) ① fork ④ UNIX socket tmux server PTY #1 PTY #n ... P1 ... Pn アクティブ SSH切断 sshd login shell tmux client SIGHUP ① ❌切断 PTY tmux server PTY #1 PTY #n ... P1 ... Pn アクティブ ② PTYをclose ③ closeを確認 kernel ④ SIGHUP tmux server 👉 の子プロセスは生き残る (対話シェルでない)
・Nixはビルドを記述するためのDSL → ビルドを少し広く捉えてツールや環境をセットアップするためにも使える ・実際にNixOSやhome-managerを使ってネットワークやエディタの設定ができる ・どのように実現しているか? ・`environment.etc.<name>.text` → /etc 配下へ ・`home.file.<name>.text`
→ ユーザー空間へ ・`xdg.config.<name>.text` → XDG Base Directoryへ ・これらの属性に渡した文字列はファイルとして書き出される 9 ✏️ ツールの設定をNixで記述する
・NixOSやhome-managerはすでにtmuxをNix式で扱うための属性を提供している ・`programs.tmux` ・home-managerにおける属性一覧 10 programs.tmux ▲ 発表者のtmuxの設定の一部
・programs.tmux.baseIndex ・ウィンドウ/ペイン番号が何番から開始するかを設定できる ・デフォルトは0だが、発表者は1にしている(実世界に生きているので) ・tmux.confにおける次の設定に変換される ・`set -g base-index ${baseIndex}` ・`setw -g
pane-base-index ${baseIndex}` 11 設定できる項目の例① ▲ 時代は1-indexed
・programs.tmux.plugins ・nixpkgsのtmuxPluginsに定義されているプラグインを渡すと適用できる ・TPM (Tmux Plugin Manager) を使わなくて良い → これだけでもprograms.tmuxを使う価値がある 12
設定できる項目の例② ▲ 追加のconfigも書ける
13 (余談) pkgs.tmuxPlugins ▲ 25.05時点では53個ある
・378行なのでおそらく読みやすい ・色々あるが、let-in式の本体から読むと良い ・必要に応じて束縛を読みに行く ・optionsが「定義」 、configが「実装」に対応 ・optionsでモジュール構造を決定する ・configで設定を記述する ・まずはconfigを読んでみる 14 programs.tmuxの実装を眺める①
・lib.mkMerge ・複数の属性セットを再帰的にマージする関数 ・※ `//`は上書きする ・束縛部で`tmuxConf`を構成して xdg.configFile.”tmux/tmux.conf”.textで 設定ファイルを書き出している ・特にset系やbind系のコマンドの構成は 他に比べると読みやすいはず 15
programs.tmuxの実装を眺める②
16 programs.tmuxの概観 programs.tmux options config pkgs.tmuxPlugins programs.tmux.* を定義 必要に応じて渡す .config/tmux/tmux.conf
を生成するための構造を生成 ユーザ設定 ビルドシステム ① optionsの評価
17 programs.tmuxの概観 programs.tmux options config pkgs.tmuxPlugins programs.tmux.* を定義 必要に応じて渡す .config/tmux/tmux.conf
を生成するための構造を生成 ユーザ設定 ビルドシステム ① optionsの評価 ② configを生成
programs.tmuxの概観 programs.tmux 18 options config pkgs.tmuxPlugins programs.tmux.* を定義 必要に応じて渡す .config/tmux/tmux.conf
を生成するための構造を生成 ユーザ設定 ビルドシステム ① optionsの評価 ② configを生成 ③ ビルド tmux.conf
2. tmux-nixの目標 19
・DSLが薄い ・よく使われる設定、キーバインド以外はサポートされていない → extraConfigからtmuxコマンドを書いて渡さなければいけない ・ステータスバーやペイン間の移動、色設定、etc... ・一方でfine-grainedな設定ができない箇所もある ・たとえば、base-indexやresize-amountは個別に設定できない ・ややチグハグ気味に感じる → すでに多くのユーザが利用しているAPIに破壊的変更を加えるのは難しい
(し、大多数は個別設定よりも互換性を重視するだろう) 20 programs.tmuxへの不満①
・プラグインサポートが貧弱 ・programs.tmuxはtmuxプラグインのderivationを受け取ることができる ・しかし、起点のスクリプトを自動実行してくれるだけで 設定は各プラグインのextraConfigに任されている → たとえばtmux-yankなどはキーバインドが絡むのでNix式で書ける方が嬉しい 21 programs.tmuxへの不満②
・tmux.confレスでtmuxを設定できるNixOSモジュール ・まずは発表者のtmux.confをNix式で表現できるようにして、 それからプラグインやマイナーな設定についても対応できるようにする 22 tmux-nixの目標
3. tmux-nixの実装 23
・システム全体の設定を行うための再利用可能なコンポーネント ・/etc/nixos/configuration.nix もNixOSモジュール ・中身 ・ 「どのようなフィールドが設定できるか」 (= options) ・ 「フィールドに設定する値」
(= config) ・他のモジュール群を展開するためのimports ・つまり、普段書いているNix式と特別変わりない(はず) 24 NixOSモジュールとは①
・オプション定義 ref ・型定義に相当する ・lib.types.int.betweenなど、動的型付き言語ならではの制約もある → ここまで分かればあとは書くだけです ・本来、手続き的だったシステムを宣言的なシステムに変換するためには 「圧倒的な作業 💪」が求められることを実感できます
25 NixOSモジュールとは②
・NixOSモジュールはどうテストするか → pkgs.nixosTestを使います ・KVMが立ち上がり、 書いたモジュールをビルドできる ・nixosTest.testScriptに 仮想マシンを操作するための Pythonスクリプトを渡す → machine.suceedに渡したコマンドが
成功するかどうかを検査してくれる 26 テスト
・プラグインがサポートする変数を設定するような options・configを実装する 27 tmuxPlugins.cpuの設定を実装する
・これって本当に作業なんですよね ・人間は良い抽象を考えて、コードはLLMに書かせれば良いかもしれない → 時代に取り残されそうなのでtmux-nixはLLMベースで書いてみることにした ・先に感想を言うと、本当に面白くないです レビューが中心になる 28 (余談) Vibecodingってこのためにあったんだ‼️ 😄
・Codex(OpenAI) ・なんと実行時にネットワークアクセスをすることができない ・ビルド時にネットワークアクセスができないNixと相性が良さそうですね☺️ → 良いわけない。nix fmt, nix develop, nix flake check、全部ダメ ・Copilot Agent ・こちらは結構良いです ・Gemini 2.5 Proはほどほど。tmux-nixの実装のメインはこの子がやってます ・Claude 4 Sonnetは相当賢いです、すぐrate limitが来ますが
29 使ってみる ・反映すると.tmux.confが生成されました ▲ tmux-nixを利用している様子
4. 展望・まとめ 30
31 展望 ・tmux-nixであらゆるtmuxの設定をNix式で完結できるようにする → これは`man tmux`を全部読む、という意味です泣 ・nixosTestは現状では生成される設定ファイルを見ているだけなので挙動も見れたら良さそう ・他52種類のプラグインに対応して、tmux版のnixvimのような立ち位置を目指したい ・tmux-nix以外ですが ・LLMとNixの相性が今のところかなり悪いと思っているので効率的に作業する方法を知りたい
32 まとめ ・現在開発を行っているtmux-nixを通して、NixOSモジュール開発の概要を紹介した ・ターミナルマルチプレクサであるtmuxについて紹介した ・tmuxを起動することでsshdのログインシェルから対話環境が切り離されるため、ssh接続を切っ たとしてもプロセスが終了せず、処理を継続できる ・NixOSやhome-managerを利用することでツールやネットワークの設定を記述することができる ・home-managerではprograms.tmuxを設定することでtmux.confを生成できる ・programs.tmuxはbaseIndexなどの基本設定や、nixpkgsなどで提供されているtmuxプラグイン のderivationsを受け取ってTPMレスにプラグインを管理できる
・programs.tmuxのソースコードは定義であるoptions、設定であるconfigに分離していた ・実はこれはNixOSモジュールの基本構造で、NixOSモジュールはシステム全体の設定を行うため の再利用可能なコンポーネント ・programs.tmuxはDSLが薄く、Nix式を使ってプラグインの設定をするためのAPIが提供されてい ないので微妙。tmux-nixを作ってtmuxをNixで管理してハッピーになりたい! ・さて、残念ながら発表が始まるまでに完璧なtmux-nixは実装できませんでした。今後に期待