Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Nix Meetup #2 学生サークルでの集団開発におけるNixの採用事例
Search
comavius
March 09, 2025
0
49
Nix Meetup #2 学生サークルでの集団開発におけるNixの採用事例
comavius
March 09, 2025
Tweet
Share
More Decks by comavius
See All by comavius
Nixの仕組み: Derivation編
comavius
0
58
Featured
See All Featured
Bash Introduction
62gerente
615
210k
Fireside Chat
paigeccino
41
3.8k
Typedesign – Prime Four
hannesfritz
42
2.9k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
180
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Faster Mobile Websites
deanohume
310
31k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
76
Docker and Python
trallard
47
3.7k
Git: the NoSQL Database
bkeepers
PRO
432
66k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
24k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
110
Transcript
学生サークルでの集団開発に おけるNixの採用事例 こま🍁 / @comavius
自己紹介と発表の流れ
自己紹介 こま🍁 / @comavius 東京科学大学 工学院 経営工学系 2年 科学大の技術系サークルの traP
にいます Nix歴は1年とちょっと 触っている技術など: 競プロ(アルゴ青/ヒューリスティック青), Rust, Golang, TS, その他諸々 最近はPyO3というRustとPythonを連携させるライブラリがマイブームです
発表の流れ - 自己紹介と発表の流れ - プロジェクト概要と技術選定 - 開発メンバー - 実装 -
今後の課題 - 終わりに
プロジェクト概要と技術選定
競プロのジャッジサーバーを 作りたい
競プロ(競技プログラミング )とは 「xxxを入力として受け取り、yyyを出力する」ソースコードを書け、という問題が与えられ、回答としてソースコード を提出する。 例: 問題: 空白区切りの2つの整数を受け取り、和を出力せよ 回答例(python): left, right
= map(int, input().split()) print(left + right)
プロジェクト概要 ユーザーが回答の コードを提出して... バックエンドサーバーが 受け取って... ジャッジサーバーが いい感じに スケジューリングして.... ジャッジ環境で 実行される
実行環境管理の技術選定 - 要求 仕様面の要求 - 多数の言語処理系を同じコンテナ上で動かしたい - 一部の処理系が他の処理系に依存している (例: brainfxxk(bfc)とclang)
実装する人間としての気持ち - 言語のインストールと言語一覧やコンパイルコマンドなどのメタデータを統一的に扱いたい - あまりに原始的な実装はつらい
案1: Ansible 長所 - 日本語の書籍がそれなりに出版される程度にポピュラー - サークル内に結構な数の利用者がいた 短所 - 典型的でないことをしようとすると再現性が保証されないらしい
- プロジェクト内に利用者がいなかった
案2: Aqua 長所 - 学習コストが低い 短所 - すべてのツールをAquaで一元管理するコンセプトではないらしい
案3: Nix 長所 - 再現性に関して責任を負う必要がない - サークル内・プロジェクト内に利用者がいた 短所 - 学習コストが高い
選ばれたのは ... Nixでした - メタデータを簡単に記述できる - 関数型言語の経験者がそれなりにいた - 個人的に使ってみたかった
開発メンバー
開発メンバー 経験者4人・未経験者2人で開始 現在は経験者2人・元未経験1人で開発
実装
実装 言語ごとにderivationを作ってdockertoolsでdocker image内に配置する default = pkgs.dockerTools.buildImage { name = "exec-container";
copyToRoot = [self.packages.${system}.environment]; }; (flake.nix: L80-L85) (traP-jp/traO-Judge-docs develop ./exec-container)
実装 各言語のファイルにコンパイル時・実行時コマンドやその他メタデータを記述 languages = [{ binName = "clang++"; compile =
"${myClang}/bin/clang++ -std=c++23 -o $OUT $SRC"; name = "C++(clang)"; run = "$OUT"; }]; (compilers/clang/default.nix: L17-L24) (traP-jp/traO-Judge-docs develop ./exec-container)
実装 各言語のメタデータをJSONとして出力 (languageSettings.nix 長いので省略) (traP-jp/traO-Judge-docs develop ./exec-container)
実装 sbomnix(tiiuae/sbomnix)を用いたライセンス違反の予防 nix-shell -p sbomnix --run "sbomnix .#environment" if grep
-q "AGPL" sbom.spdx.json; then echo "Error: AGPL license found in sbom.spdx.json." exit 1 fi (license-check.sh: L6, L9-L12) (traP-jp/traO-Judge-docs develop ./exec-container)
課題
Mac上でビルドできない 開発メンバーの開発環境の Mac上で一部のderivationがビルド出来ず、デプロイ先が Linuxのため対応のコスト を払いたくない →Dockerコンテナ内でビルドをするようにして解決
GitHub Actionsを使えない Actionsの記憶容量制限(5GB)に引っかかってCI/CDを回せない →しかし、いずれ超えてしまうため、GitHub Larger RunnerあるいはSelf Hosted Runnerの使用を検討中 スライド作成中に確認したところ Standard
Runnerの容量が増えていて今なら回りそう
長期的な課題 - 継続的にメンテナンス・オンボーディングができるか? - Nixpkgsのアップデートに追従できるか? - Nix側のエコシステムが弱い一部の言語をどうするか? - サンプルコードでテストを回したい
終わりに
終わりに - 少し宣伝 traOJudge 今年4月リリース予定 いずれnix式の評価をする問題も投稿できるようになるので乞うご期待!
終わりに ご清聴ありがとうございました