あんパン

こしあん派

自分のはてなブログで1年以上前の記事に警告を出すようにした

ふと自分のブログのアクセスログを見ていたところ、1年以上前の記事への参照が意外と多かった。過去記事全ての情報の鮮度に責任は負えないなと思ったので、1年以上前の記事には警告を出すようにした。例えば以下の記事には警告が出る。

masawada.hatenablog.jp

スクリプトも置いといたので、よければご利用ください。設定 > 詳細設定 > headに要素を追加 あたりに置くと動きます。はてなブログProをご利用中の方で「トップページの表示形式(PC版)」を「一覧形式」にしている場合は、各記事にのみ表示されます。

gitで自分が関わったことがあるファイルだけを一覧するワンライナー

$ git log --name-status --author="$(git config --get user.name)" | grep -E '^(A|M|D)\b' | awk '{ print $2 }' | sort | uniq

git logの最後にディレクトリ名を入れると、そのディレクトリ以下のファイル一覧を取得することができます。昔書き捨てたスクリプトがあった気がするんだけどどこにやったかな〜というときに便利です。どうぞご利用ください。

dunstとsystemdのtimerで端末のバッテリが減ったら通知を出す

昨晩夕飯食べずに寝落ちしてしまい、PCの電源も刺さずにつけっぱなしにしてしまった。それを忘れて朝PCを触っていたところ電源が落ちた。以前からバッテリが減っていることに気づけず困っていたので、バッテリが減っていて充電もしていなかった場合に通知を出すことにした。

f:id:masawada:20200418171950p:plain

通知にはdunstを利用しているのでこれを使う。dunstifyを利用すると任意のテキストで簡単に通知を出すことができる。

まず以下のスクリプトを適当に $PATH に含まれてるディレクトリの中に放り込む。 /sys/class/power_supply/BAT0 とか BAT1 とかでバッテリ情報が入ってるのでこれを使う。 自分の端末はThinkPad T480でフロントバッテリとリアバッテリがあるので BAT0BAT1 があった。これを実行すると、全てのバッテリの残量が10%未満かつ充電していない場合にdunstでアラートを表示できる。

#!/bin/bash

set -eu

urgency=1

for battery in $(ls /sys/class/power_supply/ | grep BAT); do
  battery_path="/sys/class/power_supply/${battery}"
  battery_capacity=$(cat ${battery_path}/capacity);
  battery_status=$(cat ${battery_path}/status);

  if [ ${battery_capacity} -ge 10 ] || [ ${battery_status} = "Charging" ]; then
    urgency=0
  fi
done

[ "${urgency}" = 1 ] && dunstify -u critical 'Low Battery!'

exit 0;

あとはこれを1分おきに実行する。いま使っているディストリビューションはArch Linuxで、デフォルトでcronは入らないしsystemdのタイマー機能を利用する。

まずはsystemdのUnitファイルを $HOME/.config/systemd/user/low-battery-notifier.service みたいな名前で保存する。/path/to/low-battery-notifier は実行ファイルを置いた場所を指定する。これで、 systemd --user start low-battery-notifier.service で通知が動いていれば問題ない。

[Unit]
Description=Notify low battery alert

[Service]
Type=oneshot
ExecStart=/path/to/low-battery-notifier

次にこれを1分おきに実行するよう設定する。以下のtimerファイルを $HOME/.config/systemd/user/low-battery-notifier.timer みたいな名前で保存する。 serviceファイルと名前を対応づけて拡張子を.timerにする必要がある。

[Unit]
Description=Notify low battery alert timer

[Timer]
OnCalendar=*-*-* *:*:00

[Install]
WantedBy=timers.target

これで systemctl --user enable low-battery-notifier.timer && systemctl --user start low-battery-notifier.timer すると1分おきに最初のスクリプトが実行されるようになる。タイマーが正常に動いているかどうかは systemctl list-timers --users --all で確認することができる。

$ systemctl list-timers --user --all
NEXT                        LEFT     LAST                        PASSED  UNIT                       ACTIVATES
Sat 2020-04-18 17:37:00 JST 20s left Sat 2020-04-18 17:36:05 JST 34s ago low-battery-notifier.timer low-battery-notifier.service

という具合。これでバッテリが減ったら1分おきに通知が出る。

(Arch) LinuxでGitHub CLIを利用する

github.com

READMEにある通り

$ yay -S github-cli

でインストールできる。yay はGoで書かれているAURヘルパで、要はナウい yaourt 。他のAURヘルパを利用しても良い。 go-pie が依存になっており、 go がインストールされているとコンフリクトする可能性があるので、コンフリクトした場合は手で解決する必要がある。

gh コマンドを実行すると認可のためにブラウザが開かれる。ここでSSOが有効なorgをauthorizeしようとする際には事前にSSOを突破しておく必要がある(突破していないとアクセス権を取得できない)。間違えてアクセス権がない状態でtokenを発行してしまった場合は、一旦GitHubの Settings > Applications > Authorized OAuth Apps > GitHub CLI (dev) を一旦revokeして、.config/gh/config.ymlを削除すると再度認可が行われる。

$ gh issue list

Issues for masawada/housekeeping

#312  2020年2月目標
#311  2020/02/01-2020/02/29献立計画
#310  2月購買計画
#306  2020年旅行候補
#304  2019大掃除落穂拾い
#300  2020年欲しいもの
#299  2020年コンテンツ消費リスト
#298  2020年やりたいこと
#297  2020年上半期計画
#284  引っ越し

個人の計画repoのIssue一覧が見られて便利になった。いまのところIssue/P-Rを作るかリストするかブラウザで開くかくらいしかないけど、端末上で自由に編集したりレビューできるようになったりしたらめちゃくちゃ便利だと思う。

git addするときにerror: 's/' does not have a commit checked outというエラーが出て困ったので原因を追う

小ネタです。

$ git add -A
error: 's/' does not have a commit checked out
fatal: adding files failed

addできない。困った。

何が起きているのか

$ ls
README.md  s/
$ ls -la s
total 12
drwxr-xr-x 3 masawada masawada 4096 Jan  7 16:46 ./
drwxr-xr-x 4 masawada masawada 4096 Jan  7 16:46 ../
drwxr-xr-x 7 masawada masawada 4096 Jan  7 16:46 .git/

どうやら s というディレクトリが作られていて、中に .git ディレクトリが作られている状態。しかしこんなディレクトリを作った記憶はない… 一体何故…

ディレクトリが作られた原因を探る

ひとまずhistoryを眺めたところ、いつもと様子がおかしいコマンドを発見しました。

$ git git s

自分はgitconfigのaliasで git sgit status -sb に指定しています。

[alias]
    s = status -sb

しかし git を重ねてしまっているのがおかしそう。実行してみましょう。

$ git git s
WARNING: You called a Git command named 'git', which does not exist.
Continuing in 0.1 seconds, assuming that you meant 'init'.
Initialized empty Git repository in /home/masawada/sandbox/git/s/.git/

やはりこれが原因でディレクトリが作られていた!! しかし平時は git git と重ねても単にエラーが出て終了するだけです。

assuming that you meant 'init'

これはgitconfigでautocorrectを有効にしているから。git git と重ねると git init に補完されてリポジトリのディレクトリが作られてしまう、というオチでした。

[help]
    autocorrect = 1

autocorrectについてはこちら

git-scm.com