hogashi.*

日記から何から

shufコマンドがないときに同じことをするシェルスクリプト

 shuf コマンドとは、入力の行をシャッフルして出力するコマンド。 shuf invocation (GNU Coreutils 9.5)

 手元の環境に入ってなかったので、こういうのを書いてみた。 Bash で試しています。オプションとかは実装してません。

function shuf() {
  OLD_IFS=$IFS
  IFS=$'\n'
  (
    for line in $(
      if [ -n "$1" ]; then
        cat "$1"
      else
        cat /dev/stdin
      fi
    ); do
      echo "$RANDOM"$'\t'"$line"
    done
  ) | sort -n | cut -f2-
  IFS=$OLD_IFS
}

 こう使える。哲学者の例文は 食事する哲学者の問題 - 診断メーカー から。

$ echo {A..G} | tr ' ' '\n' | shuf
C
A
B
E
G
D
F
$ shuf shokuji.txt
ニーチェが右のフォークを置く
ニーチェが右のフォークを取る
プラトンがルソーを殴る
ルソーがニーチェを殴る
ソクラテスが素手で食べ始める

 パイプとかリダイレクトって普段何気なくやっているけど、そういえば標準入力で流し込まれる側って、どうやってその内容取るんだっけ……? となって面白かった。 Redirections (Bash Reference Manual) を見ると、標準入力は /dev/stdin から取れることがわかる。

 $RANDOMBash のシェル変数で、参照するたびに 0 〜 32767 のランダムな整数が展開される https://www.gnu.org/software/bash/manual/bash.html#index-RANDOM

 $IFS もシェル変数で、フィールドの区切り文字の列 https://www.gnu.org/software/bash/manual/bash.html#index-IFS 。これを一時的に改行文字のみに変えることで、 for で変数に入る区切りを 1行ごとにする (これをしないと、 for で空白文字とかで区切られてしまって、行の途中までで別の行になったりしてしまう……)。 $OLD_IFS に逃がしておく技は、過去に whichコマンドを読んだ - hogashi.* で見たやつ。

progress要素でモアイまわしができる

 progress 要素で遊ぶシリーズ。

 まず普通に x と y を追従するようなものをつくるとこう。 Glitch で遊んでたのをここにコピペしてるのでなんか変かも。

 x と y を入れ替えると、もう奇妙な感覚になる。

 つまりこれをうまく使って遊べそう → これモアイまわしじゃん、ということに気づいたのだった。

300x300で, x と y は...

 やっぱり座標が変そうなので Glitch 版も貼っておきます。

 GIF で貼っておくと、こういう動きをするはず。

クリア表示もあります

 追記: もちろん progress 要素じゃなくてもよくて、月とかでもよい。こっちのほうが回転の様子とかはわかりやすい。

 MDN <progress>: The Progress Indicator element - HTML: HyperText Markup Language | MDN を見ていたら、 ::-webkit-progress-bar みたいな疑似要素があって、色とかを変えられるようだった。 ::-webkit-... のほうしか指定してないので Chrome 系じゃないと色が変わらないかも。

 あと MDN 見てると meter 要素 <meter>: The HTML Meter element - HTML: HyperText Markup Language | MDN というのもあって、今回みたいな用途だったら meter 要素のほうが比較的あっている?かも? しかしモアイの回転度が進捗かというとそんな気もする。

 本家モアイまわしはこちら。子どものころから大好きなゲームです。
www.skt-products.com

progress要素並べまくるとスペクトラムアナライザみたいな表示ができる

 progress 要素はこういうやつ <progress>: 進捗インジケーター要素 - HTML: ハイパーテキストマークアップ言語 | MDN

 並べまくるとこうなる。 DOM なのでたぶん遅そう。

 値はランダムなだけだけど、こういう音楽といっしょに楽しめる。
www.youtube.com

会話日記

 実家に帰って親と会話していて 2時間くらい経っていた。いろんな話題があったけど、その中で、常々頭の中にはあった考えを即興で言葉に起こして流れをもって伝える、という場面がお互いにたくさんあった。喋りながら、これはブログだなと思って、あまりしっかり推敲しない、構成とかもなんとなくの文章を、なんとなく読んでもらい、返信をもらって(細かい相槌はあるが)、今まであった思考が半ば無理やり形に落ち着いて、なんとなくそうかなと思っていたこととかの結論が(選択肢としていくつかある、という形ででも)出たのが嬉しい状態。

シェルで簡単ストップウォッチ

 ルービックキューブを揃えるまでの時間を測りたい!手元にシェルしかない!そんなときはこう

$ time read


real    0m2.951s
user    0m0.000s
sys     0m0.000s

 read コマンドで入力を待ち受けていた時間が出てくれる。これで計測開始 (コマンド開始) と 計測終了 (read に入力) の両方を Enter キーでできるのでわかりやすくて便利。

 ↑は bash で試したけど、 zsh では $ time (read) とするとよいようだった ($ time read だと何も出ない。ビルトインのコマンドは(カレントのシェルで実行されるので)計測されないので、括弧をつけてサブシェルで実行させると計測できる、とのことだった zsh - `time echo` got no output - Unix & Linux Stack Exchange)。

GitHub Actions workflowのannotationを一覧するシェルスクリプトを書いた

三行

解説

困り

 annotation といっているのはこれ (画像) *1 。この画像の場合、 Node.js 16 を使う actions は非推奨なので Node.js 20 を使うものに更新してね、具体的には actions/checkout@v3 と actions/setup-node@v3 だよ、と言われている。

Node.js 16 actions are deprecated. Please update the following actions to use Node.js 20: actions/checkout@v3, actions/setup-node@v3. For more information see: https://github.blog/changelog/2023-09-22-github-actions-transitioning-from-node-16-to-node-20/.

 書かれていることに沿って更新したらいいのだけど、こういうのっていろんな workflow にそれぞれ書いていて (特に actions/checkout とか)、それぞれ annotation がついている。どれで何が出ているかの一覧ができないので、結構不便。

先行研究と困り

 一覧するためのツールとして、 gh コマンドの拡張機能という先行研究がある。最近の workflow の実行を取ってきて annotation を一覧するというもの。これはかなり便利で見やすくて、小さいリポジトリならこれで戦える。
swfz.hatenablog.com

 問題は workflow がたくさんある大きいリポジトリで、最近の実行だけ見ていると間に合わない。ので、リポジトリにある workflow それぞれについて、最も最近の実行の annotation を取ってきたい。

作ったもの

 という動機で書いたのが今回のシェルスクリプト
github.com

 gh コマンドを叩きまくって、 workflow 一覧 → それぞれの check suite の最新の run 一覧 → それぞれの annotation 一覧 という順番で取ってくる。 GitHub Actions は登場人物が多くて難しい (理解してないだけでもっと簡単な方法があったりするのかも……)。
 シェルスクリプトなので、 git clone でもコピペでもいいので手元に持ってきて、素朴にこう実行したら動く (gh とか jq とかは必要なので適宜入れてください)。

$ ./list-workflow-annotation-for-repo.sh owner/repo > annotations.md

 実行すると markdown で出力される (標準出力に出すので↑みたいにするのがおすすめ)。改行とかはあんまり頑張ってないので見づらいかもだけど、例えば GitHub issue に貼るとこういう感じで見れる。各見出しは、該当の annotation が出ている workflow やその実行の画面へのリンクになっている。


出力される markdown はこんな感じ (クリックで開く)
## [CodeQL](https://github.com/hogashi/twitterOpenOriginalImage/blob/master/.github/workflows/codeql-analysis.yml)
Latest run: [https://github.com/hogashi/twitterOpenOriginalImage/actions/runs/9468391494](https://github.com/hogashi/twitterOpenOriginalImage/actions/runs/9468391494)

### [Analyze (javascript)](https://github.com/hogashi/twitterOpenOriginalImage/actions/runs/9468391494/job/26084641757)

## [git-issue-release](https://github.com/hogashi/twitterOpenOriginalImage/blob/master/.github/workflows/git-issue-release.yml)
Latest run: [https://github.com/hogashi/twitterOpenOriginalImage/actions/runs/9468384396](https://github.com/hogashi/twitterOpenOriginalImage/actions/runs/9468384396)

### [action](https://github.com/hogashi/twitterOpenOriginalImage/actions/runs/9468384396/job/26084617386)
```
Node.js 16 actions are deprecated. Please update the following actions to use Node.js 20: kouki-dan/git-issue-release@v1. For more information see: https://github.blog/changelog/2023-09-22-github-actions-transitioning-from-node-16-to-node-20/.
```
```
The following actions uses node12 which is deprecated and will be forced to run on node16: kouki-dan/git-issue-release@v1. For more info: https://github.blog/changelog/2023-06-13-github-actions-all-actions-will-run-on-node16-instead-of-node12-by-default/
```

## [Node.js CI](https://github.com/hogashi/twitterOpenOriginalImage/blob/master/.github/workflows/nodejs.yml)
Latest run: [https://github.com/hogashi/twitterOpenOriginalImage/actions/runs/9471522972](https://github.com/hogashi/twitterOpenOriginalImage/actions/runs/9471522972)

### [check](https://github.com/hogashi/twitterOpenOriginalImage/actions/runs/9471522972/job/26094921517)
```
Node.js 16 actions are deprecated. Please update the following actions to use Node.js 20: actions/checkout@v3, actions/setup-node@v3. For more information see: https://github.blog/changelog/2023-09-22-github-actions-transitioning-from-node-16-to-node-20/.
```

 これを見ながら、順番にバージョンを上げたりしていったらよい。

それ Renovate でできるよ

 これ書いてて気付いたんだけど、 actions の更新は Renovate がやってくれる。なので、いっこ annotation を見かけたら、 Renovate の Dependency Dashboard issue を見に行って、チェックをつけたら終了できる。便利ですね〜

 今回書いたシェルスクリプトの存在意義を頑張ってこじつけると、 annotation というのは ("使ってる actions が古いよ"だけではなく) エラーや警告全般が存在するので、何かエラーや警告が出ているかどうかを見て回る、というのに使える。
 例えば、 typo しているとエラーになるわけだけど、そういうときはこういう annotation がつく。エラーだと当然実行が失敗するので気付けるけど、警告系だと気付かないことも多そうだし、まあまあ使えることもあるかも。

The workflow is not valid. .github/workflows/nodejs.yml (Line: 9, Col: 5): Unexpected value 'runs-o' .github/workflows/nodejs.yml (Line: 9, Col: 5): Required property is missing: runs-on