• 2025-03-25の日報

    2025年3月25日

    今日は高槻やよいちゃんの誕生日!わいわい。

    この日はなぜかやよい軒高槻店が混むらしい...


    近いうちに祖父が高遠に花見に行くらしく、ナビの設定方法を教えて欲しいと頼まれたので教えていた。 初めに自分が設定の見本をやってみせたのだけど、各項目が自分の設定を記憶してしまったらしく上のあたりを押し続ければ設定できるようになってしまった...

    あんまり練習にならないんじゃないかと思ったりはしたけれど、これはこれで良いかなと思う事にした。


    前日に連日の眠気は薬の副作用じゃないかと疑って、今日は薬を飲まずに過していた。 くしゃみとか鼻水は出るものの、家から出なければ気になるほどでもないし、進捗をかなり出せた気がするのでむしろ飲まない方が良いなと思った。

    今日やったこと

    Emacs

    不具合の原因は恐らくbyte compileの設定とgitmojiのcapfを設定していたletがおかしくなっていたからだった。

    letで本来変数定義に来るはずの式が来ておらず、その対応がおかしくなっていた。 この2つを消したら正常になったので多分これが原因なんだと思う。


    不具合の修正も兼ねてleafの設定も見直していたのだけど、leafのキーワードの中には:bindとか:customとかがあって、:bindでキーバインド、:customで変数を設定できるらしい。:configとかしか使っていなかったのでこの機会に使ってみることにしてみた。

    あと、:initはプラグインの読み込み直後に実行されると思っていたけど実際は読み込み前だった。 プラグインに実装されている関数を呼び出すとエラーになるのでこのあたりも修正した。

    結果として色々知見が得られたのでなんだかんだ良かったなと思っている。


    auth-infoについて調べていた。

    auth-infoはEmacs組み込みの認証を取得するフレームワークで、これを使うとプラグイン側が機密情報を取得する際に統一されたAPIで情報を得られる。 auth-infoは複数のバックエンドに対応しているが、ここではPGPバックエンドを使う場合について説明していく。

    例えば、GeminiのAPIキーを管理したいとする。

    まず認証情報の登録を行う。

    ~/.emacs.d/.authinfoに以下のような形式で書き込む。

    machine gemini.google.com login ユーザー名 password パスワード
    

    ~/.emacs.dに移動し以下のコマンドを実行する。

    gpg --encrypt --recipient 鍵ID .authinfo

    すると~/.emacs.d/.authinfo.gpgというファイルが作成されるはず。これで認証情報の登録は完了。

    次にEmacs側の設定をする。

    まずauth-sourcesを設定する。これで先程登録したファイルがauth-infoで読み込まれる。

    (setq auth-sources '("~/.emacs.d/.authinfo.gpg"))

    次に以下のS式を評価する。 エコーエリアに((:hostから始まる文字列が表示されればOK。

    (auth-source-search :host "gemini.google.com"
                        :user "ユーザー名")

    これでauth-infoの設定は完了した。 ただ、auth-infoはそのままだとパスワードを取り出しづらいのでこんな感じにwrapper関数を書いとくと良い。

    (defun get-secret (host)
      "Wrapper functino for auth-info"
      (let* ((found (cl-first (auth-source-search :host host
    					      :user "ユーザー名")))
    	 (credentials (eval `(ht ,@(--map `(,it ,(plist-get found it))
    					  '(:user :secret :save-function)))))
    	 (secret (funcall (ht-get credentials :secret))))
        (if (functionp secret)
    	(funcall secret)
          secret)))

    これで(get-secret ("gemini.google.com"))で設定したパスワード文字列が表示されるはず。 あとはこの結果を変数に代入するなりして利用すれば良い。

    gptelで使う例はこんな感じ。

    (setq gemini-apikey (get-secret "gemini.google.com"))
    (leaf gptel
      :config
      (setq
       gptel-model 'gemini-1.5-flash-8b
       gptel-backend (gptel-make-gemini "Gemini"
    		   :key gemini-apikey
    		   :stream t)))

    これでinit.elにクレデンシャルを直書きしなくても認証できるようになる。

    明日以降やりたいこと

    AI関連の何かができたら良いなと思っている。


    ko-fi ☕GitHub Sponsors 🐙