私が歌川です

@utgwkk が書いている

一昨年のふるさと納税でもらった日本酒をちょっと消費した。日本酒はなかなかスイスイ減らないということを学んだので、去年のふるさと納税はビールにしたのだった。消費しやすいものを返礼品としてもらうぐらいがちょうどよい。

胃腸の調子が悪くて困った。お腹を温めて寝るしかなさそう。

今日の一曲

季節感がゼロ。そろそろブルアカの5分アニメ放映されないか?

かがやきサマーデイズ

かがやきサマーデイズ

  • アビドス高等学校対策委員会《ホシノ(CV:花守ゆみり)、シロコ(CV:小倉唯)、ノノミ(CV:三浦千幸)、セリカ(CV:大橋彩香)、アヤネ(CV:原田彩楓)》
  • アニメ
  • ¥255
  • provided courtesy of iTunes

うどん、こんぴらさん、ビール

無事に香川に泊まってうどんを食べる。

こんぴらさんの本殿まで行って、見事な筋肉痛を持って帰ることができた。

朝ごはんにうどん、昼もうどん、もう1つうどん、という感じでさすがに満腹になった。

丸亀のマイクロブリュワリーでビールを飲んで、特急に乗り込んで帰る。

岡山駅前のイオンモールではフードコートで地ビールを飲むことができる。おつまみが無限にあるということだ。

Go Modulesを使いつつgo runで依存モジュールのCLIを実行したときに使われるバージョンは?

Go Modules Reference - The Go Programming Language を流し読みつつ手元でちょっと実験した感じだと、go.modに指定したバージョンになるようだった。

Module-aware commandsの節を見るとそのように読める。

In module-aware mode, the go command uses go.mod files to find versioned dependencies, and it typically loads packages out of the module cache, downloading modules if they are missing.

module-awareな場合の go run サブコマンドも、go.modからライブラリのバージョンを特定していそう。


いきなり話題が変わるけど、tools.go に依存ライブラリを列挙するのはGo公式のwikiでも紹介されている手法のようだった。How can I track tool dependencies for a module? という節で紹介されている。

Go製のツールはシングルバイナリで動くことが多く、おもむろにバイナリを落としてきたり、Homebrewに上がっているものを使ったりしがちだけど、ツールのバージョンがどんどん勝手に上がらないように管理したいときは固定するのが便利そう。

シェルの履歴をDropboxにバックアップする取り組み

プロローグ

2022年末、人類はWSLのファイルシステムを消し飛ばした*1のであった。かけがえのないシェルの履歴*2の思い出と共に。

シェルの履歴が全部消えると、補完に頼って入力しているコマンドが急に打てなくなって、不便になる。2023年はこういった悲しみを減らしていきたい。

ということで、表題の取り組みをやっていくことにした。

バックアップするスクリプトを書く

以下のようなスクリプトを ~/local/bin/backup-zsh-history など適当なパスに置いた。5秒おきに ~/.zsh_history ファイルをDropboxにコピーするスクリプトになっている。-u オプションを付けることで、~/.zsh_history が更新されていなかったらコピーしないようにしている。

#!/bin/sh
set -eu

if [ "$BACKUP_DEST_PATH" = "" ]; then
  echo 'BACKUP_DEST_PATH not set' > /dev/stderr
  exit 1
fi

while sleep 5; do
  cp -u /home/utgwkk/.zsh_history $BACKUP_DEST_PATH
done

systemd unit fileを書く

スクリプトを手軽にdaemonizeできたらなんでもいい。最近のWSLではsystemdが使えるので、unit fileを書いて適当なところに設置したらよい。user unitは使えない*3ようなので、最速で動くことを重視して /etc/systemd/system ディレクトリ以下に置いた。

[Unit]
Description=Backup zsh_history

[Service]
Environment=BACKUP_DEST_PATH=/mnt/c/Users/utgwkk/Dropbox/zsh_history/kaede
ExecStart=/home/utgwkk/local/bin/backup-zsh-history

[Install]
WantedBy=default.target

あとはこのunitを動かせば完成する。

エピローグ

2023年はこのようにしてシェルの履歴をDropboxにバックアップすることにした。これでまたWSLのファイルシステムを吹き飛ばしてもDropboxから復元できるはず。WSLでsystemdが (おおむね) 動くようになったのを知れたのもよかったと思う。systemd user unitが動くようになったらまた教えてください。


(2023/1/4 17:23 追記)

シェルの履歴をDropboxにバックアップする取り組み - 私が歌川です

事故で空っぽのファイルになったときに困りそうだけど file history あるからいいみたいな理論なのかな

2023/01/04 17:15
b.hatena.ne.jp

だいたいそういう理論です。コピー元のファイルサイズが明らかに小さかったらcpしない、みたいなことができるとより安全になりそうだけど、うまくできるかどうか。

(2023/1/4 17:25 追記)

ある程度の期間ごとにコピー先のファイルを分けることもできそう、しかしDropbox上のファイルが増殖しまくるのでは?


おまけ: WSLでsystemdを有効にしたらWindowsのexeファイルがexec format errorで実行できなくなる

WSLでsystemdを有効にしたら、見出しのような現象が発生した。WSL上ではWindowsの実行ファイルも実行できるはずだが、以下のようにexec format errorが出て実行できなくなる。

% /mnt/c/win32yank/win32yank.exe -o
zsh: exec format error: /mnt/c/win32yank/win32yank.exe

WSLのリポジトリのissueでworkaroundが紹介されているので、これに倣えばよい。

github.com

つまり、以下のような内容のファイルを /usr/lib/binfmt.d/WSLInterop.conf というパスに保存して sudo systemctl restart systemd-binfmt コマンドを実行したら直る。

:WSLInterop:M::MZ::/init:PF

*1:dpkgの依存が解決できなくなったので破壊した

*2:.zsh_history

*3:systemctl --user コマンドがFailed to connect to bus: No such file or directoryというエラーを返す。あまり深追いしていない