vc-modeでコミットメッセージを書くときに diffを表示する

基本的にコミットする際は git commit -vVimで書いているけど, Emacsの標準機能だけでいい感じにできないだろうかと思って調べてみた. 個人的には diffを見ながらコミットメッセージを書ければそれでよく、あとは基本的にはいらない.

;; Emacs 30以下向け
(add-hook 'vc-before-checkin-hook #'vc-diff)
(add-hook 'vc-checkin-hook (lambda ()
                             (when-let* ((buf (get-buffer "*vc-diff*"))
                                         (window (get-buffer-window buf)))
                               (delete-window window))))

とりあえず checkin(この表現も懐かしいが)前に vc-diff を実行し, commitが終わったらその窓を消すということで対応できた. Emacs 30までだとこれでいいんだけど, この辺りのソースを調べていると Emacs 31から log-edit-maybe-show-diff という関数が追加されており, これを使うと log-edit-hook の調整だけで対応できた

;; Emacs 31以上の場合
(setopt log-edit-hook '(log-edit-insert-message-template log-edit-maybe-show-diff))

log-edit-hook には変更したファイルリストを表示とかの機能がデフォルトで含まれているのだが, それは不要なので除いた.

余談

初めはコメントしてコミット用バッファに全部埋め込めばいいんじゃねって思ったんだけど, AIに尋ねたところ git commit でコメントとか diffを削除してくれるのは commit自体の機能ではなくてそのあとの cleanというフェーズでやっているらしい. なんで # で始めた行をコメントとして扱うということは単体ではできないようです.

Emacs on WSLからマルチバイト文字を含む文字列を Windowsのクリップボードに送る

(defun my/wsl-copy-region-to-clipboard ()
  (interactive)
  (unless (use-region-p)
    (user-error "not specified region"))
  (let ((input (buffer-substring-no-properties (region-beginning) (region-end)))
        (cmd "/mnt/c/Windows/System32/clip.exe")
        (windows-encoding 'utf-16le))
    (deactivate-mark)
    (with-temp-buffer
      (set-buffer-file-coding-system windows-encoding)
      (insert input)
      (let ((coding-system-for-write windows-encoding))
        (unless (zerop (call-process-region (point-min) (point-max) cmd))
          (error "failed to copy to Windows clipboard"))))))

;; キーは好きなものにしてください
(global-set-key (kbd "C-x M-w") #'my/wsl-copy-region-to-clipboard)

専用のツールを使ったり文字エンコーディングツールを別途使うなどでも対応はできるが, clip.exeと elispだけでもなんとかなった.

Playwright for .NETを Linuxで使うときのメモ

長年動かしていたスクレイピングのコードがあったのが、この度対象のウェブサイトが Next.JSに移行して JavaScriptランタイムがないと全くサイトの情報が取れなくなってしまったので Playwrightを使うように書き換えた。TypeScriptを使うのが主流なんだろうけど馴染みがないので Python .NETのどちらを選ぶかとなったのがちゃんとした型あり言語の方がいいかということで .NET版, C#を選んだ。F#でもいいんだけど、手続型ぽくしか書けないだろうし、C#にした。いくつかすんなりといかないことがあったのでそのメモ

プロジェクトへパッケージの追加

dotnet add package Microsoft.Playwright

まあこれは普通にいける

各種ブラウザのインストール

パッケージをインストールするとブラウザインストールスクリプトもインストールされるのだが、これが PowerShellスクリプトWindows以外の環境だと初めに PowerShellをインストールする必要があった. Githubかバイナリを取得するのでもいいが、面倒なので dotnetコマンドで入れた

dotnet tool update --global PowerShell  

これは $DOTNET_ROOT/tools にインストールされるので、そこに PATHを設定し、設定ファイルを再読み込みする。インストール出来たらブラウザをインストールする

pwsh bin/Debug/net9.0/playwright.ps1 install

これで ~/.cache/ms-playwright の下に各種ブラウザがインストールされる。デフォルトだと Chromium, WebKit, Firefoxがインストールされる。Chromiumのみ必要などの場合は PowerShellスクリプトコマンドライン引数で調整することができる

シングルバイナリ化した場合の対応

Playwrightを動かすには, node.jsや JavaScriptファイルが必要になる。これらのファイルはパッケージインストール時に併せてインストールされるが、シングルバイナリ化した場合これらのファイルは同梱されない。(dotnet run で動かす場合は特に気にする必要はない)。これらのファイルが入ったディレクトリをバイナリと同じディレクトリか、環境変数 PLAYWRIGHT_DRIVER_SEARCH_PATH に置く必要がある。(開発時のためか 2つ上のディレクトリでも可ではある)

# シングルバイナリ化
dotnet publish -c Release -r linux-x64 --self-contained true -p:PublishSingleFile=true

# PATHが設定されている場所へインストール
cp bin/Release/DOT_NET_VERSION/linux-x64/publish/MyProgram your_install_path

# node.jsと JSファイルのインストール
cp -r bin/Release/$(DOTNET_VERSION)/linux-x64/.playwright your_install_path

これでシングルバイナリ化したプログラムを動かすことができた.

世田谷区で膨張したバッテリーを処分したときのメモ

こちらは 2025年 8月 3日時点の情報です。更新などされている可能性があるので詳細は市役所などに問い合わせてください

先日使用していた System76のラップトップのバッテリが膨張していることに気づいた。はじめは何かキーボードが打ちづらいなと思ってよく見てみるとキーボードが盛り上がる程度にバッテリーが膨張していた。危険なので修理のページを参考にラップトップからバッテリーを取り外した。

取り外したのはいいけど家に置いておくのも危険なので早めに処分するため世田谷区のごみ処理などページを見てみたが、世田谷区自体はそれらの充電式電池の処分を行っておらず一般社団法人JBRCが行っているとのことでそちらのホームページを確認した。しかし一般社団法人JBRCでは正常な充電式電池の処分は行っているものの、膨張したものは取り扱いしておらずそれらについては自治体に連絡してほしいとのことだった。

そこで市役所に問い合わせたところ世田谷区では下記の場所に直接持っていけば引き取ってくれるとのことだった。

  1. 清掃・リサイクル部事業課
  2. 世田谷清掃事務所
  3. 砧清掃事務所
  4. 玉川清掃事務所
  5. エコプラザ用賀
  6. リサイクル千歳台

最寄りの場所を特定しそこに持参し回収してもらうことができた。若干遠かったがもしものことを考えて公共機関などは使わず徒歩で持っていた。どの施設でも予約の必要はなく、また無料であった。係の人が危険性尾をわかっていなさそうな感じは少しあったが無事自宅からは危険物を撤去できて安心できた。

最後に

他の自治体を調べると豊島区や横浜市などではホームページに膨張したバッテリの処分方法が掲載されておりいちいち問い合わせなくても処分方法を把握することができた。どの自治体のホームページでもリチウムイオン電池などを安易に捨てるな危険だなどは書いているがその処分方法まできちんと掲載できているのは自治体ごとにまちまちであり、意識の差というか考えられているかは自治体依存であった。世田谷区では処分方法が皆無というわけではなかった、記載がなく問い合わせる必要があった。同じように困っている人がいると思うし、よくわからないから適当に捨ててしまおうとする人もいると思うので、そこは改善してほしいと感じた。

スマホが完全に壊れてしまったときのメモ

先日3年弱利用していた Pixel5aがいきなり全く使えなくなってしまった。ディスプレイ表示どころか充電さえ反応がない。原因は これ。最初は交換プログラムを使おうとしたのだが度重なるトラブルで交換まで 3-4週間近くかかるということになり、即座に新しいスマートフォンを買って移行作業を行った。しかしデータの移行は概ね古いスマホが生きていることが前提ですんなりとはいかなかったので今後同じ問題があったときのためにメモを残しておく

Google Account

保存していて backup codeの 1つを使って復旧。これにより Google関係はほぼ問題なかった。Google Authenticator の移行も特に問題なかった。Google Authenticatorが大変なのかなと思っていたけど問題がなかったのでそこに依存する MFAも軒並み問題なかった。

Microsoft Authenticator

仕事で使っているアカウントについてはどうやっても復旧できなかった。そのため会社の担当の方に連絡し、一度MFAを無効化し再度登録することで問題を解消した。個人で使っていた方はアプリ以外の認証手段がいくつかあったのでそれを使ってサインインし、古いスマホを削除、新しいスマホで新たに MFAの登録を行った。

Google Wallet

Suicaで使っていたものだったので

  1. モバイル Suicaにサインイン
  2. カードの再発行

を行い, しばらく時間を待ち再発行が確認されたあと新しいスマホに同カードを登録した。1万円以上入れていたからどうなるかと思ったけどそのままで問題はなかった。

Paypay銀行

独自のトークンアプリを使っており、前のスマホなしで復旧するためには利用時に発行された物理カードのカード番号とパスワードが必要であった。ただ私は一時海外のサイトで買い物をしすぎた結果物理カードが止められてしまい、新しい非物理カードを発行した際に古いものが無効になり処分していたため持っていなかった。このためやむおえず物理カードを再発行してもらい、アプリを利用することができるようになった。再発行手数料は 1100円だった。

その他

残りのアプリについてはパスワードやら SMSを使って概ねなんとかなった。

最後に

スマホが文鎮化するというのを初めて経験したけど、旧スマホがないと復旧がかなり手間だなと感じた。このためだけに 2台持ちにするのもどうかとは思うけど、もしものことは考えておかないと結構詰むなと思いました。

markdown-modeに VSCodeっぽい画像貼り付け機能を実装した

github.com

Emacs 29に yank-media という機能が追加されて clipboardにあるデータを各モードで自由にハンドリングできるようになった. VSCodemarkdownを書いているときに画像をペーストすると inline linkが挿入されますが、それと同じようなことができるように markdown-mode に機能を追加しました. ただし Emacsでは普通の yankでは実現できなくて, M-x yank-media という別のコマンドを使う必要があります. (clipboardの中身を見て先頭が画像だったら挙動を変えるとかの関数を自分で実装すればいけるとは思います). あと Emacs29以上が必要になります.

example

ブラウザでコピーした画像を markdownファイルに貼り付けている例になります.

実装

例として html-mode で clopboardの画像を img タグで Base64で貼り付ける場合を示します.

(add-hook 'html-mode-hook (lambda ()
                            (yank-media-handler "image/.*" #'html--image-media-handler)))

まず各種 major-modeやその hookで yank-media-handler 関数を呼び出して, マッチさせたい mime-typeの正規表現とそのハンドラを設定します. ハンドラの引数は 2つあって, 1つめが mime-type, 2つめがデータになります.

(defun html--image-media-handler (mimetype data)
  (let* ((mime (mailcap-mime-type-to-extension mimetype))
         (base64 (base64-encode-string data))
         (img-tag (format "<img src=\"data:image/%s;base64,%s\" />" mime base64)))
    (insert img-tag)))

ハンドラの実装はこのようになります. あとは dataを好きなように扱ってやればよいです. mime-typeをどうかしたい場合は, mailcap packageなどに各種ユーティリティがあるので探してみるとよいでしょう.

Ubuntu 22.04の設定メモ

syohex.hatenablog.com

PC買ったので設定に関するメモ. 最近デフォルト信仰なので昔ほど凝ったことはせず最低限使えるようにするメモ

Gnome Extension

  • Auto select headset 有線ヘッドフォンなどを使ったときいちいちどのデバイスを使うのか問われるのがうざかったので
  • Clipboard Indicator クリップボード履歴のために. 個人的には Windowsのものがベストで, 使い勝手はそれより悪いのだけど使えるレベルではある. 同じ名前の拡張があるので注意(Linuxに限らず macOSもそうだけど未だになんでこの機能がデフォルトで使えないのだろうか)
  • Workspace Indicator 今自分が作業している workspaceをわかりやすくするため

dconf editor

  • /org/gnome/shell/app-switcher/current-workspace-only trueに設定. falseだと macみたいな挙動になる. アプリを選んだら workspace関係なくすでに開かれているアプリにフォーカスする. true だと workspaceごとにアプリを起動したりスイッチできたりするようにする.
  • /org/gnome/desktop/interface/enable-animations false に設定. animationがうざいので
  • 不要なショートカットキーを全部無効化する. Settingsからでもできるけど, 一部できないのもあるので主に dconf editorから操作している.

その他

  • Ctrl, Caps lockの入れ替え. 最近は標準機能でできるのでそれを使った
  • マウス, trackpad速度の調整. 自分の気に入るレベルに調整

ぐらいかな. あとは開発などに必要なツールや動画見るのに困らないツールを apt で入れたぐらい.