Nixで既存パッケージのバイナリ名を別名に変える方法

はじめに Macに対しhome-manager経由でGNU版のsedを導入したかった。 nixpkgsだとgnusedから導入可能。 1 2 3 4 5 6 { pkgs, ... }: { home.packages = with pkgs; [ gnused ]; } ところが、環境変数PATHの順番のせいで、通常通りgnusedを入れてもBSD版sedが先に読まれてしまう。 nixないしhome-managerでPATHの順序を入れ替える方法がわからなかったので、次のようにして無理やりGNU版sedを読ませるようにする。 sed コマンドを gnused として使えるようにラップする それを shellAliases に設定 1 2 3 4 5 6 7 8 9 10 11 12 13 14 { ... }: { home.packages = with pkgs; [ # (sedコマンドをgnusedとして使えるようにwrapしたもの) ]; # ... programs.zsh = { shellAliases = { sed = "gnused"; }; } } sed コマンドを gnused として使えるようにラップする これをどうやるのかがこの記事の話題。 ...

2026-04-11 · (updated 2026-04-11) · 2 min · 252 words

sedコマンド備忘録

sedを使ったメモ。 前提 GNU sed 4.9 GNU版sedをMac + home-managerで導入する nixpkgsだとgnusedから導入可能。ただMacに標準で入っているBSD版sedと被る & PATHの順序を変える方法がわからないので、別名でsedが実行できるようにしてaliasを作る。 詳細は Nixで既存パッケージのバイナリ名を別名に変える方法 を参照。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 { pkgs, ... }: { home.packages = with pkgs; [ (runCommand "my-gnused" {} '' mkdir -p $out/bin ln -s ${pkgs.gnused}/bin/sed $out/bin/gnused '') ]; programs.zsh = { shellAliases = { sed = "gnused"; }; }; } 1 2 3 4 5 6 7 8 9 bombrary@bombrary-macbookair:~/dotfiles% sed Usage: gnused [OPTION]... {script-only-if-no-other-script} [input-file]... -n, --quiet, --silent suppress automatic printing of pattern space --debug annotate program execution -e script, --expression=script add the script to the commands to be executed BSD版とGNU版の違い あまり詳しいことは知らないが微妙に違う。 ...

2026-04-09 · (updated 2026-04-11) · 2 min · 412 words

Jenkinsをちょっと触ってみる

前置き 社内でJenkinsが使われていことは知っているが、いままで触れる機会が全然なかった。 そんな中突然Jenkinsに触れる機会があったのだが、あれこれ情報源をつまみ食いして試行錯誤した結果「なんかよくわかんないけどこうすれば動くんだろうなー」程度の理解になってしまっており気持ち悪い。 もう少し基本的なところを理解したいと思ったので勉強した。ついでに記事にした。 環境 NixOS on WSL Jenkins Version 2.516.2 参考資料 JenkinsでCI環境構築チュートリアル (Linux編・macOS編) - ICS MEDIA:導入時にこんなGUIセットアップするのか、という参考にした。ただ自分の環境はNixなので具体的な導入手順は別ページを参照する必要があった Jenkins - NixOS Wiki:NixOSでJenkinsをどうセットアップするかの解説ページだが、ただ services.jenkins.enable = true にしろとしか書いてない(でもそのシンプルさがNixの良いところ) 他に設定できるオプションは search.nixos.org を見るとよい Jenkins Pipelineを試す - とことんDevOps | 日本仮想化技術のDevOps技術情報メディア:とりあえずどうやってpipeline作って実行すればよいんだという観点で参考にした Pipeline(公式ドキュメント):pipelineってどうやって書くんだろうなという参考にした [Jenkins]パイプラインジョブがshでハングする問題 #Pipeline - Qiita:ジョブの実行がいつまでたっても終わらなかったり変なエラーで落ちたりしたときに、こちらの記事あるとおりに環境変数設定したら治った。原理はよくわかってない… JenkinsにGitHub認証情報を登録してJenkinsfileからジョブを作成できるようにする #GitHub - Qiita:クレデンシャルってどこで設定するのという観点で参考にした Declarative Pipeline で Jenkins に保存された認証情報を利用する #JenkinsPipeline - Qiita:作成したクレデンシャルをどうやってpipelineで使うのという観点で参考にした Jenkinsのインストール まずはJenkinsが動く環境を整える必要がある。 セットアップは環境次第だが、自分の場合WSL上でNixOSを動かしているので、その上にJenkinsサーバーを動かす。 NixOSの場合は、以下を configuration.nix に追記して nixos-rebuild switch するだけ。 1 2 3 4 5 6 7 8 9 { # ... services.jenkins = { enable = true; }; # ... } そのほかのオプションの詳細は jenkinsのnixファイル を見てもよいが、公式docのAppendix A. Configuration Options または search.nixos.org からだと視覚的に見やすい。 例えばデフォルトでは http://localhost:8080 でアクセスできるのだが、以下のように port でポートを変えることも可能。 ...

2026-02-15 · (updated 2026-03-08) · 5 min · 953 words

LuaのパターンマッチングライブラリLPegを用いて四則演算の文法をパースする

前置き PandocでRedmineのwiki記法(textile)をGitLab Flavor Markdownに変換したかった しかしデフォルトのReaderだと完全な変換は不可能 Redmineのマクロに対応できない。特に {{collapse(...) ...}} マクロを折り畳み形式に変換したい パース後にLua filterで修正する方針もやろうとしたが、ASTの木構造を書き換えるレベルの修正が必要になり力尽きた 箇条書きの中に collapse が含まれているケースがきつい ところでPandocにはCustom Readerという機能があり、Luaを使って自分でReaderをかける Pandoc - Creating Custom Pandoc Readers in Lua LPegというライブラリを使えばBNFっぽい書き方で文法が書けて楽そう という経緯があり、まずLuaのLPegライブラリを勉強することにした。以下はその備忘録。 やること 四則演算の式を木構造(入れ子のテーブル構造)にパースすることが目的。 逆に、木構造に変換した後の処理はしない。例えば式を評価して計算値を出すことはここではやらない。 文法の正しさをチェックするために、ユニットテストを適宜書きながらコードを書いていく テスト駆動開発的にやっていく 免責事項 自分はLuaをほとんど書いたことがない。ほとんど雰囲気で書いており、何らかのベストプラクティスから外れている書き方をしている可能性がある。 LPegとは 公式サイト: LPeg - Parsing Expression Grammars For Lua PEG(Parsing Expression Grammer)がベースとなるパターンマッチングライブラリ。PEGというのは今回自分も初めて知った。どうやらCFG(Context Free Grammer; 文脈自由文法)とはまた別の形式文法らしい。 Parsing expression grammar - Wikipedia 「最初の解析がうまくいったらそれを、失敗なら次を順に試してゆき、成功したものを採用」という点がCFGとの違いの一つみたいで、これでCFGが持つ曖昧さを排除できるとか。 実行環境の準備 以下が入った環境を準備する。 Luaのインタプリタ Luaのライブラリ LPeg:PEG用のライブラリ busted:ユニットテスト用のライブラリ 一例: Nixで環境を用意する場合 Nix flakeで環境を準備する場合、以下を flake.nix として作成して nix develop コマンドを実行すれば、Luaの実行環境が作成される。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 { description = "A very basic flake"; inputs = { nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable"; flake-utils.url = "github:numtide/flake-utils"; }; outputs = { self, nixpkgs, flake-utils }: flake-utils.lib.eachDefaultSystem (system: let pkgs = nixpkgs.legacyPackages.${system}; in { devShells.default = pkgs.mkShell { packages = with pkgs; [ (lua.withPackages(ps: with ps; [ lpeg busted ])) ]; }; } ); } テスト環境の準備 メインのコードは main.lua に書くようにする テストは test.lua に書くようにする まず test.lua に以下を記載。main に含まれる add 関数(まだ未定義)のテストを試しに書いてみる。 ...

2025-11-03 · (updated 2025-11-02) · 13 min · 2740 words

DaVinci Resolve 字幕をテキストファイルからスクリプトで追加する

前置き DaVinci Resolveで動画編集する際に、字幕の入力が面倒だった。字幕を1かたまり作成する時に以下の作業が必要になる。 Text+オブジェクトを配置 文字を設定 フォントを設定 サイズを設定 タイムライン上の位置、長さの設定 最後の項目は自動化が難しいが、他は自動化できないか調べたら、どうやらスクリプト機能で実現できるようだったので調べた。以下はその備忘録。 使用環境 Windows 11 DaVinci Resolve 20.2.1 Python 3.13.7 参考資料 C:\ProgramData\Blackmagic Design\DaVinci Resolve\Support\Developer\Scripting\README.txt が一次資料らしいのでそれを読んでいく。 LuaかPythonで書けるらしい。Luaであればインタプリタの導入は必要ないし、試しにLuaで書こうと思ったが、Luaの場合いまいちモジュール名がREADMEには書かれておらず不明瞭な点と、Pythonのほうが書き慣れているということでPythonを選択する。 またText+に関してはFusionの機能であり、Fusion関連であれば詳細なドキュメントがある。 Fusion8 Scripting Guide Pythonの導入 自分のWindows環境にはこの時点でPythonが入っていなかったため、Pythonを入れる。 https://www.python.org/ からインストーラをDLして来ればよい。 READMEには以下の変数を設定しろと書いてある。内容的にPythonのモジュールパス関連の設定のようだ。 1 2 3 RESOLVE_SCRIPT_API="%PROGRAMDATA%\Blackmagic Design\DaVinci Resolve\Support\Developer\Scripting" RESOLVE_SCRIPT_LIB="C:\Program Files\Blackmagic Design\DaVinci Resolve\fusionscript.dll" PYTHONPATH="%PYTHONPATH%;%RESOLVE_SCRIPT_API%\Modules\" GUIの場合はシステム環境変数の設定画面から環境変数を設定すればよいが、PowerShellの場合は以下のコマンドでシステム環境変数を追加できる(管理者権限で実行すること)。 1 2 3 4 5 6 7 $env:RESOLVE_SCRIPT_API="$env:PROGRAMDATA\Blackmagic Design\DaVinci Resolve\Support\Developer\Scripting" $env:RESOLVE_SCRIPT_LIB="C:\Program Files\Blackmagic Design\DaVinci Resolve\fusionscript.dll" $env:PYTHONPATH="$env:PYTHONPATH;$env:RESOLVE_SCRIPT_API\Modules\" [Environment]::SetEnvironmentVariable("RESOLVE_SCRIPT_API", "$env:RESOLVE_SCRIPT_API", 'Machine') [Environment]::SetEnvironmentVariable("RESOLVE_SCRIPT_LIB", "$env:RESOLVE_SCRIPT_LIB", 'Machine') [Environment]::SetEnvironmentVariable("PYTHONPATH", "$env:PYTHONPATH", 'Machine') これでDaVinci Resolveのコンソールから、関連モジュールがimportできるようになる。 下記redditによると、DaVinciのコンソールからならimport文は不要らしい。 https://www.reddit.com/r/davinciresolve/comments/1frb4lj/save_me_please_from_this_modulenotfound_error/?tl=ja コンソール画面を開く Workspace → Console を押す。 ...

2025-10-13 · (updated 2025-10-13) · 2 min · 257 words

NixOSでmatplotlibを使いグラフを表示する - uvを使う & 共有ライブラリとoverlayの話

要約 ここではNixOSとPythonとmatplotlibでグラフを出力するための方法を記載する。 グラフを表示するケースとして以下の2つのケースを考える。 (パターン1)NixだけでPythonのパッケージ管理をする方法 (パターン2)astral-sh/uvでPythonのパッケージ管理をする方法 前者はあっさり終わるが、後者はすんなり動かないので工夫が必要。具体的には以下の工夫がいる。 共有ライブラリのパスが解決できずエラーになる: uvが外部から持ってきたライブラリにプリコンパイルされたCの共有ライブラリファイルがあるため。LD_LIBRARY_PATH の指定をする必要がある tkinterのモジュールが解決できず、グラフが出力されない:nixpkgsに入っているPythonのデフォルトにはtkinterがついてないため。overlayとoverrideを使い、tkinter入りのPythonを用意する NixOSでほかのLinuxディストリビューションと同じようなことをしようとするとひと手間必要という良い例かも。 なお、今回紹介するのはあくまで NixOS 上での例である。例えばNixOSでないほかのOSでNixパッケージマネージャだけ導入しているようなケースでは、(環境によるが)パターン2は特に工夫なく動くかもしれない。 また、今回使うuvは0.4.8である。uvは開発が早いので、数か月後にはこの記事通りに動かなくなってるかも。 1 2 [bombrary@nixos:~/example]$ uv --version uv 0.4.8 (パターン1)Nixを用いたパッケージ管理例 はじめに、flake.nix ファイルを作る。 1 2 [bombrary@nixos:~/example]$ nix flake init wrote: /home/bombrary/example/flake.nix 以下のような flake.nix を書く。python.withPackagesを使うことで、特定のパッケージが入ったPythonを作ることができる(イメージ的には、venvと同じものを /nix/store/ で管理する感じ)。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 { description = "A very basic flake"; inputs = { nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable"; }; outputs = { self, nixpkgs }: let pkgs = nixpkgs.legacyPackages.x86_64-linux; my-python = pkgs.python312.withPackages (python-pkgs: [ python-pkgs.matplotlib ]); in { devShells.x86_64-linux.default = pkgs.mkShell { packages = with pkgs; [ my-python ]; }; }; } nix develop して、上記で定義したPython環境が使える状態にする。 ...

2024-09-16 · (updated 2024-09-16) · 8 min · 1533 words

HugoのテーマをPaperModに変えた

今のシンプルなままでも良い気がしたが、シンプルさはそのままでもう少しだけリッチなサイトに改築してみたくなったので、それっぽいテーマを探してそちらに引っ越してみた。 移行先のテーマは PaperMod。 before と after before after やったこと PaperMod導入 PaperModのInstallationに従う。 いくつかやり方が紹介されているが、自分はsubmoduleを使ってPaperModを持ってきた。 1 git submodule add --depth=1 https://github.com/adityatelange/hugo-PaperMod.git themes/PaperMod config.tomlの修正 PaperModのWikiを参考にすればどんな設定をすればよいのかがわかる。Wikiはyamlで書かれているが、ブログ解説当初はtomlで書いていたため、tomlに読み替えて進めた。 また、Wikiからうまく見つけられない情報があった場合は、直接PaperModの layouts ディレクトリをgrepしてそれっぽい変数が無いか探した。 searchページとarchiveページ searchページとarchiveページはそれぞれ次の項目を参考にした。 Archives Layout Search Page searchとarchiveのリンクをヘッダーに追加したいなら、次のように config.toml に書けばよい(参考:Add menu to site)。 1 2 3 4 5 6 7 8 9 10 11 [[menu.main]] identifier = "tags" name = "Tags" url = "/tags/" weight = 20 [[menu.main]] identifier = "archives" name = "Archive" url = "/archives/" weight = 30 ファイルの移動 ブログ用に書いていたCSSやKaTeXの設定を移す必要があった。 ...

2024-05-19 · (updated 2024-05-19) · 1 min · 202 words

Nix用いたツール実行・開発環境の構築方法

要約 この記事では、Pythonでいうvirtualenv的なことをする方法について述べる。つまり、ツールを一時的に導入したり、ツールが実行可能な開発環境を整備したりする目的として、以下の話題を扱う。 各種コマンド nix shell nix run nix develop direnv + nix-direnv nix flake init にtemplateを指定する方法 なお本記事ではNixOS固有の話ではなく、(パッケージマネージャとしての)Nixを使う場合の話をする。使用するNixとhome-managerのバージョンは以下の通り。 1 2 3 4 ~ $ nix --version nix (Nix) 2.18.1 ~ $ home-manager --version 24.05-pre はじめに Nixではユーザ環境にパッケージを入れるために、以下の2つのどちらかを使うはず(宣言的に管理できる後者がよりデファクトになっている気がする)。 nix-env home-manager これらは永続的にパッケージを導入する仕組みであるが、そうではなく一時的にパッケージを導入したいという場合があるだろう。具体的には、以下の2つの場合がありえる。 あるツールを使いたいが、別に永続的にそれを使う必要はない。試しに使ってみたい場合は、ある瞬間にそれが使えれば十分 virtualenvみたいに、開発時のみに特定のバージョンの開発ツールが導入されている状態であってほしい 前者の場合、nix shell、nix runコマンドを用いる。後者の場合、nix developコマンドを用いる。 nix shellコマンド nix shell コマンドを用いると、一時的にパッケージを導入して新しいshellに入ることができる。 以下のように使うと、パッケージを導入した状態で新しいshellに入る。パッケージは複数指定が可能。 1 nix shell (package name) (package name) ... 以下は、nix shell コマンドを用いてgccを使える状態にする例。 1 2 3 4 5 6 ~ $ nix shell nixpkgs#gcc ~ $ gcc --version gcc (GCC) 13.2.0 Copyright (C) 2023 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ちなみに、1パッケージ内の1コマンドだけ実行したい場合で、わざわざ新しいshellを作る必要もない場合は、以下のように --command 引数を指定する。 ...

2024-05-13 · (updated 2024-07-20) · 9 min · 1832 words

Nixでハッシュ関係の処理をPythonで実装してみる

前回の記事でstore pathを手で計算する方法を見てきたが、output hashの計算については手で計算するのが無理だった。これをPythonスクリプトで実装するとどうなるかをやってみた。 ゴールとしてはoutput hashを計算するコードを実装することであるが、 Nix32表現の計算とtruncateオプションの計算はそれにあたって必要なので実装した おまけでderivation hashとsource hashの計算も実装した なお、今回のコードについて Nix 2.21.1を参考に作っている すべてのパターンは網羅できていない可能性が高い(特にoutput hashの計算方法) Nixのいくつかの処理をPythonで実装してみるのコードを一部使って実装する である。また、コードの実行例にあたって、前回の記事のderivationの準備にしたがってsampleのderivationが準備されているものとする。 Nix32表現の計算 Nix32の計算はlibutil/hash.ccで行われている。 以下の並びのビット列があるとする(見やすさのため8bitごとに縦棒で区切ってある)。 1 b07 b06 b05 b04 b03 b02 b01 b00 | b15 b14 b13 b12 b11 b10 b09 b08 | b23 b22 b21 b20 b19 b18 b17 b16 | ... Nix32表現では、以下のように5bitずつ取り出していく。 1 2 3 4 5 b04 b03 b02 b01 b00 b09 b08 | b07 b06 b05 b14 b13 b12 b11 b10 b19 b18 b17 b16 | b15 ... その5bitに文字を対応させる。具体的には、5bit値idxに対して、以下の文字列のchars[idx]を対応させる。 ...

2024-04-21 · (updated 2024-04-21) · 3 min · 622 words

Nixのstore path計算方法メモ

Nixでは、パッケージの再現性を担保するために、/nix/store/下にハッシュ値を含んだ名前であらゆるファイルを保管する。そのハッシュ値がどのような情報から計算されるものなのかを知っておくことは、なぜNixが再現性を確保できるのかを考える上で重要である。 そこで、この記事では、Nixのstore path、つまりその中に含まれるハッシュの計算方法について解説し、実際にステップバイステップで計算してみる。 参考記事 How Nix Isntantiation Works (Web Archive) Nix manual(unstable)Store Pathの仕様 Nix PillsのChapter 18 なお、本記事では nix derivation show コマンドの結果からいろいろと情報を取り出すために jq を用いる。 store pathの種類 ほとんどStore Pathの書き起こしみたいになってしまうが書いておく。 まずstore pathは、/nix/store/<digest>-<name>の形式を持っている。 <digest>というのは、fingerprint(後述)をSHA256でハッシュ化し、160bitに圧縮したうえでNix32表現にしたもの。ドキュメントには「SHA256の先頭160bitをBase32表現にしたもの」と記載があるが、 Base32という言葉はRelease Note 2.20でNix32という名前に改められた。理由としては通常の意味のBase32表現とは処理が異なり紛らわしいためのようだ 先頭160bitを単純に切り取ってNix32表現にするのではなく、実装では complressHash という関数で圧縮処理が行われている(該当ソース)。 fingerprintは、<type>:sha256:<inner-digest>:/nix/store:<name>の形式 <type>というのは以下のいずれか text:<input store path>:<input store path>:...:derivation。<input store path>には、(存在すれば)derivationが参照する他のファイルのパスを指定する source:<input store path>:<input store path>:...:外部から持ってきたファイルをNAR形式でアーカイブ化したもの sourceがinput store pathを持つケースってどんなときなの?と感じるが、確かにlibstore/store-api.ccにそれっぽいコードが見つかる。しかし実例がまだ良くわかっていない…。 output:<id>:derivationからビルドされたもの、もしくはビルド予定のものを表す。<id>には通常outが入るが、ビルド出力結果を複数分けているようなパッケージではbinやlib、devなどが指定されうる。 <inner-digest>は、inner-fingerprintをSHA256でハッシュ化し、Base16表現にしたもの inner-fingerprintの計算方法は、上述のtypeによって異なるが、これは後々実際に計算してみつつ解説する いろいろと書いてあるが、結局/nix/store下におかれるパスの種類は実質fingerprintの種類であり、すなわち3種類である。 text:derivationを表す source:ビルドに必要なファイル、ソースコードを表す output:ビルド生成物そのもの、ないしディレクトリを表す (前準備)derivationの準備 今回手で計算するもととなるderivationを簡単に書く。 Nix PillsのChapter 7の内容をもとに。汎用性とかは意識せず、x86_64-linux前提で書く ただNix Pillsをそのまま書き起こしになってしまうのもつまらないので、flakeを使って書いてみる。 まずいくつかのファイルを作成する flake.nix:flakeファイル default.nix で分けないで、ここに直接derivationを書く mubuilder.nix:derivationをもとに成果物をビルドするためのシェルスクリプト hello.c:ビルドする適当なC言語ソースコード 1 2 3 nix flake init touch mybuilder.sh touch hello.c hello.cの中身 ...

2024-04-20 · (updated 2024-04-21) · 7 min · 1462 words