大規模言語モデルによる対話を AI と呼びたくない

大規模言語モデル(LLM)によるいろいろを AI と呼びたくないなという気持ちです。

AI って、人工知能ですよ、人造知性ですよ。

LLM は、かなり自然な言語対話をコンピューターで実現したとても革新的なものだけど、知性というと何か足りなさそう。

じゃあ何が足りないんですか? 何やろうねえ、読者への課題とします。

おわり。

ガンダムマーカー メッキシルバーがメッキ調にならなくなった

買ったときはめちゃくちゃメッキ調になってすごいと思った「ガンダムマーカー EX ガンダムメッキシルバー」ですが、4 年ぐらい経って使おうとしたら全くメッキ調にならなくなりました。

www.mr-hobby.com

新品を買ってきたので新旧比較、全然違う。

かなり使用期限の短い商品なのかも……

悲しい

技術書典 20 サークル参加決定

技術書典 20 にオンライン&オンサイトでサークル参加します。

techbookfest.org

日時と場所は

  • オンラインは 2026.04.11-26
  • オンサイトは 2026.04.12 池袋サンシャインシティ 展示ホール D

下記の書物を持っていく予定です。

よろしくね!

Nix Flake モジュールのオプションからドキュメントを自動生成する

Cspell というものがあります。ソースコード中の単語のスペルをチェックしてくれるツールです。うっかりタイポして面倒なエラーになるのは嫌なので自分がソースコードを書くときはチェックをしています。

cspell.org

それを nix flake check コマンドの中でやってしまおうというのが cspell-nix です。11 月ごろに作りました。

github.com

cspell-nix は Flake Parts のモジュールとして提供しています。

flake.parts

引数などはモジュール定義を見れば書いてあるのですが、わざわざそのためにソースコードを見るのは不要な部分も多いですし Commonmark などで書いてレンダーされた結果を見れるようにしたいです。しかし手でドキュメントを書いていくのはソースコードとの乖離などに注意する必要があります。そこでドキュメントを自動生成できるようにしました。

pkgs.nixosOptionsDoc

pkgs から nixosOptionsDoc という関数が定義されていて、これでドキュメントの生成ができます。できるのですが、なかなかつまづきました。

まず、nixosOptionsDoc にコメントが書かれていないためソースコードを見て使い方を推定する必要があります。ソースコードを辿ると nixpkgs/nixos/lib/make-options-doc/default.nix にコメントが書かれていてこれがヒントになります。

  Generates documentation for [nix modules](https://nix.dev/tutorials/module-system/index.html).

  It uses the declared `options` to generate documentation in various formats.

  # Outputs

  This function returns an attribute set with the following entries.

  ## optionsCommonMark

  Documentation in CommonMark text format.

  ## optionsJSON

  All options in a JSON format suitable for further automated processing.

  `example.json`
  ```json
  {
    ...
    "fileSystems.<name>.options": {
      "declarations": ["nixos/modules/tasks/filesystems.nix"],
      "default": {
        "_type": "literalExpression",
        "text": "[\n  \"defaults\"\n]"
      },
      "description": "Options used to mount the file system.",
      "example": {
        "_type": "literalExpression",
        "text": "[\n  \"data=journal\"\n]"
      },
      "loc": ["fileSystems", "<name>", "options"],
      "readOnly": false,
      "type": "non-empty (list of string (with check: non-empty))"
      "relatedPackages": "- [`pkgs.tmux`](\n    https://search.nixos.org/packages?show=tmux&sort=relevance&query=tmux\n  )\n",
    },
    ...
  }
  ```

  ## optionsAsciiDoc

  Documentation rendered as AsciiDoc. This is useful for e.g. man pages.

  > Note: NixOS itself uses this output to to build the configuration.nix man page"

  ## optionsNix

  All options as a Nix attribute set value, with the same schema as `optionsJSON`.

  # Example

  ## Example: NixOS configuration

  ```nix
  let
    # Evaluate a NixOS configuration
    eval = import (pkgs.path + "/nixos/lib/eval-config.nix") {
      modules = [
        ./module.nix
      ];
    };
  in
    pkgs.nixosOptionsDoc {
      inherit (eval) options;
    }
  ```

  ## Example: non-NixOS modules

  `nixosOptionsDoc` can also be used to build documentation for non-NixOS modules.

  ```nix
  let
    eval = lib.evalModules {
      modules = [
        ./module.nix
      ];
    };
  in
    pkgs.nixosOptionsDoc {
      inherit (eval) options;
    }
  ```

次に Flake モジュールを評価する必要があるのですが、flake-parts.lib.evalFlakeModule では評価後の perSystem のモジュールの options を評価するとよく分からないエラーになりました1。また、flake-parts.lib.evalFlakeModule を使用すると Flake Parts が提供するオプションまでドキュメントになってしまいます。これは要りません。なので自分のモジュールだけ単品で lib.evalModules で評価することにしました。しかし、これだと flake.apps などを参照する config の方がエラーになるので options だけのモジュールに分割して lib.evalModules に渡す必要がありました。

この辺りを乗り越えるとモジュールのオプションを Commonmark や Asciidoc に変換できるようになります。

出力したドキュメントはこんな感じになりました。

おしまい


  1. モジュール引数に pkgs がないというエラーなのですが、そんなことはないはず……

2025 年のふりかえり

例年ふりかえり記事を書いていないのですが、なんとなく書いてみるかという気になったので書いてみます。

健康

人生で初めて入院しました。

一時的な症状でよかったですが、またなるのはこりごりです。

抗鬱薬は続けて飲んでいます。

しごと

変わらず Herp からの業務委託を受けています。

Nix を書いてることが多い感じがします。

今のペースで続けていきたいです。

生活

妻と仲よく暮らしています。

昨年は庭できゅうりがめちゃくちゃ成りました。295 本。

屋外の水道管が破損して水漏れしました。賃借家屋なので管理会社経由で修理してもらいました。こういうとき水道局の減免制度があるから利用しよう。

同人

モナドドリル』を発行しました。

ドリルという性質上解説をたくさん入れるわけにはいかないので構成に頭を悩ましました。2 回はちゃぶ台返しをした気がします。

技術書典 18 と 19 で販売しました。

購入はこちらからどうぞ。

趣味

写真

写真熱が冷めています。フィルムの期限が切れてるのでもっと撮った方がいいですね。歩くと体力も付くし。

カメラはちょっと増えました。

旅行

ハーベストの丘」でめちゃくちゃわんちゃんにモテました。ネネちゃんというらしい。かわいい。寒かった。1 月。

f:id:kakkun61:20260105091312j:image

「第27回プログラミングおよびプログラミング言語ワークショップ」に参加しに三谷温泉へ行きました。おもしろい話がいっぱい聞けて楽しい。温泉も入れる。3 月。

f:id:kakkun61:20260105092116j:image

寝台特急「ウェストエクスプレス銀河」の座席が取れたので初めて出雲大社に行ってきました。「銀河」の乗客はみんな一癖ある感じ。出雲はその日だけ寒かった。帰りの HOT7000 系の一番前の座席が展望ですごくよかった。4 月。

f:id:kakkun61:20260105092439j:imagef:id:kakkun61:20260105092739j:image

「大阪関西万博」は 5 月に行ってきました。個別館はドイツにしか入られないぐらい混んでたんですけど、秋はもっとすごかったみたいですね。

f:id:kakkun61:20260105093250j:image

東京の知り合いと現地合流して「静岡ホビーショー」に行ってきました。これもすごい混みようでモデラー展示はちょっとしか見られなかったです。メーカー展示は見たいところだいたい見られてよかった。5 月。

f:id:kakkun61:20260105093643j:image

このあと 6 月に技術書典で東京に行って、5 月 6 月の遠出の疲れのせいか冒頭のめまい症になりました。

めまいから復帰し「関数型まつり」へ。来年あるなら何か話せればいいなあ。

f:id:kakkun61:20260105094223j:image

プログラミング

doujin.kakkun61.com のメンテナンスをしたり、envar というツールを作ったりしました。

今年中に動くところまでできたらいいなあというツールも作っています。

鉄道模型向けの自作デジタルコマンドコントロール(DCC)の実装は中断されています。再開したい。

また、Kubernetes とか触ってみるかとサーバー用途にするために GMK Tech の G3 という Intel N150 機を買ってみました。なんとか昨日に Raspberry Pi 2 B も込みのクラスターを組めました。いやあこの辺り何も分からん。

定理証明支援系である Lean をさわり始めました。Language Server がすごくちゃんと動いていてすごいです。Haskell Language Server も安定して使えたらいいのになという思いが強くなりました。

ゼロから始めるLean言語入門 ― 手を動かして学ぶ形式数学ライブラリ開発

模型

鉄道模型がまた増えました。なんで……? せめて部屋の線路を開通させねばならないです。一旦は開通させたものの出入りが難しくなるので跳ね上げ式にしようとした結果走れない状態になっています。Z ゲージのショーティー用のジオラマを作ったのは、小さくても満足感あるなという発見がありました。

プラモデルを組むのはいいけど塗装をしようとすると急に腰が重くなるので、それが簡単になるようなんかしくみを作りたいですね。

今年は

幸運であれば娘が生まれる予定で、しかも染色体異常があることが分かっているため、生まれた場合どういう生活になるのかまだ分からず、いろいろと予定が立てづらい状況です。無事に生まれてくれるといいなあ。

それでもこれらぐらいはしたいなと思っています。

  • 開発中のツールをリリースする
  • 鉄道模型のレイアウトを開通させる
  • 自作 DCC の実装を進める

2026 年もよろしくお願いします。

Envar — ディレクトリーごとに切り替える環境変数を一元管理する

Envar というコマンドラインツールを作りました。

github.com

これは環境変数の値をディレクトリーごとに切り替えるツールです。

例えば FOO という環境変数について、ディレクトリー path/to/A では hoge という値にして、ディレクトリー path/to/B では fuga という値にする、ということができます。下記のような vars.yaml ファイルでその設定をします。

FOO:
  path/to/A: hoge
  path/to/B: fuga

また、環境変数の値を別のコマンドの出力値にするということもできます。

この例は自分が使っている設定ファイルから抜粋したもので、gh コマンドで使用するアカウントを私用・しごとで切り替えるものです。

# vars.yaml
GH_TOKEN:
  /home/kazuki/Projects/Work:
    gh: kakkun61_work
  /home/kazuki/Projects:
    gh: kakkun61
# execs.yaml
gh: gh auth token --user %s

よくあるかもしれない質問

direnv と何が違うの?

direnv はそのディレクトリーで設定したい環境変数をそのディレクトリーに置いた設定ファイルに書きます。主にプロジェクトを使う人みんなに必要になる環境変数を設定する用途です。プロジェクト都合の環境変数です。

それに対して envar は設定ファイルはユーザーの設定ディレクトリーに置きます(例えば ~/.config/envar)。上記例のアカウントの切り替えなど個人の都合の環境変数を設定する想定です。

対応しているシェルは?

今のところ bash だけです。需要があれば zsh とかも対応するかも。