💤

Githubで見つけたツールを勝手に紹介する

2022/12/23に公開約17,200字

こんにちは。この記事はヌーラバーブログリレー 23 日目として書いています。

今回は Github を徘徊しているときに気になったツールを試してみて紹介しようと思います。

mergestat-lite

https://github.com/mergestat/mergestat-lite

mergestat-lite は Git リポジトリから SQL 構文のクエリ発行が行えるツールです。WHERE 句や ORDER BY 句もサポートしており、どのようなテーブルや列があるかが分かってしまえば欲しい情報を簡単に表示することができます。

❯  mergestat "select * from commits"
+------------------------------------------+------------------+-------------+--------------------+---------------------------+----------------+--------------------+---------------------------+---------+
| HASH                                     | MESSAGE          | AUTHOR_NAME | AUTHOR_EMAIL       | AUTHOR_WHEN               | COMMITTER_NAME | COMMITTER_EMAIL    | COMMITTER_WHEN            | PARENTS |
+------------------------------------------+------------------+-------------+--------------------+---------------------------+----------------+--------------------+---------------------------+---------+
| 73044b4af769c8e54eb048b564ec964a71a6f6f0 | fix index.html   | hanako      | hanako@example.com | 2022-12-21T22:33:46+09:00 | hanako         | hanako@example.com | 2022-12-21T22:33:46+09:00 | 1       |
|                                          |                  |             |                    |                           |                |                    |                           |         |
+------------------------------------------+------------------+-------------+--------------------+---------------------------+----------------+--------------------+---------------------------+---------+
| ecf4546d02d4ac821177673b6f548895f07b525a | add index.html   | hanako      | hanako@example.com | 2022-12-21T22:33:03+09:00 | hanako         | hanako@example.com | 2022-12-21T22:33:03+09:00 | 1       |
|                                          |                  |             |                    |                           |                |                    |                           |         |
+------------------------------------------+------------------+-------------+--------------------+---------------------------+----------------+--------------------+---------------------------+---------+
| a5b83a9a34f089f469e8c5f4947522ed2762c9cc | remove test      | tarou       | tarou@example.com  | 2022-12-21T22:31:33+09:00 | tarou          | tarou@example.com  | 2022-12-21T22:31:33+09:00 | 1       |
|                                          |                  |             |                    |                           |                |                    |                           |         |
+------------------------------------------+------------------+-------------+--------------------+---------------------------+----------------+--------------------+---------------------------+---------+
| 19cbbe96326262dd341122ce0f4bfb4bd5446a13 | add line to test | tarou       | tarou@example.com  | 2022-12-21T22:31:18+09:00 | tarou          | tarou@example.com  | 2022-12-21T22:31:18+09:00 | 1       |
|                                          |                  |             |                    |                           |                |                    |                           |         |
+------------------------------------------+------------------+-------------+--------------------+---------------------------+----------------+--------------------+---------------------------+---------+
| c41d55112214e8ce3d7a3ab6c03e6d041da07d0b | add test         | tarou       | tarou@example.com  | 2022-12-21T22:31:02+09:00 | tarou          | tarou@example.com  | 2022-12-21T22:31:02+09:00 | 1       |
|                                          |                  |             |                    |                           |                |                    |                           |         |
+------------------------------------------+------------------+-------------+--------------------+---------------------------+----------------+--------------------+---------------------------+---------+
| dc76d3ae978b4b0bc5b65a61d19c16abe6970aa0 | change README    | tarou       | tarou@example.com  | 2022-12-21T22:25:59+09:00 | tarou          | tarou@example.com  | 2022-12-21T22:25:59+09:00 | 1       |
|                                          |                  |             |                    |                           |                |                    |                           |         |
+------------------------------------------+------------------+-------------+--------------------+---------------------------+----------------+--------------------+---------------------------+---------+
| cbe87c5672548f8bf13b19c82a60361ee4d1fc15 | add README       | tarou       | tarou@example.com  | 2022-12-21T22:22:41+09:00 | tarou          | tarou@example.com  | 2022-12-21T22:24:11+09:00 | 0       |
|                                          |                  |             |                    |                           |                |                    |                           |         |
+------------------------------------------+------------------+-------------+--------------------+---------------------------+----------------+--------------------+---------------------------+---------+

WHERE 句を使えば特定ユーザのコミットを見ることできます。

❯  mergestat "select * from commits where AUTHOR_NAME='tarou'"
+------------------------------------------+------------------+-------------+-------------------+---------------------------+----------------+-------------------+---------------------------+---------+
| HASH                                     | MESSAGE          | AUTHOR_NAME | AUTHOR_EMAIL      | AUTHOR_WHEN               | COMMITTER_NAME | COMMITTER_EMAIL   | COMMITTER_WHEN            | PARENTS |
+------------------------------------------+------------------+-------------+-------------------+---------------------------+----------------+-------------------+---------------------------+---------+
| a5b83a9a34f089f469e8c5f4947522ed2762c9cc | remove test      | tarou       | tarou@example.com | 2022-12-21T22:31:33+09:00 | tarou          | tarou@example.com | 2022-12-21T22:31:33+09:00 | 1       |
|                                          |                  |             |                   |                           |                |                   |                           |         |
+------------------------------------------+------------------+-------------+-------------------+---------------------------+----------------+-------------------+---------------------------+---------+
| 19cbbe96326262dd341122ce0f4bfb4bd5446a13 | add line to test | tarou       | tarou@example.com | 2022-12-21T22:31:18+09:00 | tarou          | tarou@example.com | 2022-12-21T22:31:18+09:00 | 1       |
|                                          |                  |             |                   |                           |                |                   |                           |         |
+------------------------------------------+------------------+-------------+-------------------+---------------------------+----------------+-------------------+---------------------------+---------+
| c41d55112214e8ce3d7a3ab6c03e6d041da07d0b | add test         | tarou       | tarou@example.com | 2022-12-21T22:31:02+09:00 | tarou          | tarou@example.com | 2022-12-21T22:31:02+09:00 | 1       |
|                                          |                  |             |                   |                           |                |                   |                           |         |
+------------------------------------------+------------------+-------------+-------------------+---------------------------+----------------+-------------------+---------------------------+---------+
| dc76d3ae978b4b0bc5b65a61d19c16abe6970aa0 | change README    | tarou       | tarou@example.com | 2022-12-21T22:25:59+09:00 | tarou          | tarou@example.com | 2022-12-21T22:25:59+09:00 | 1       |
|                                          |                  |             |                   |                           |                |                   |                           |         |
+------------------------------------------+------------------+-------------+-------------------+---------------------------+----------------+-------------------+---------------------------+---------+
| cbe87c5672548f8bf13b19c82a60361ee4d1fc15 | add README       | tarou       | tarou@example.com | 2022-12-21T22:22:41+09:00 | tarou          | tarou@example.com | 2022-12-21T22:24:11+09:00 | 0       |
|                                          |                  |             |                   |                           |                |                   |                           |         |
+------------------------------------------+------------------+-------------+-------------------+---------------------------+----------------+-------------------+---------------------------+---------+

ユーザごとの総コミット数を降順で表示しています。

❯  mergestat "select count(*) as count, author_name from commits group by author_name order by count(*) desc"
+-------+-------------+
| COUNT | AUTHOR_NAME |
+-------+-------------+
| 5     | tarou       |
+-------+-------------+
| 2     | hanako      |
+-------+-------------+

すべてのブランチを抽出してます。

❯  mergestat "select * from refs where type='branch'"
+------+--------+--------+-----------------+------------------------------------------+--------+
| NAME | TYPE   | REMOTE | FULL_NAME       | HASH                                     | TARGET |
+------+--------+--------+-----------------+------------------------------------------+--------+
| main | branch | NULL   | refs/heads/main | 495fc3d11ccc6681c84f058bcffb1e2dfcf9c42d | NULL   |
+------+--------+--------+-----------------+------------------------------------------+--------+
| test | branch | NULL   | refs/heads/test | 4dafff74adf938361a9f5e8c587a0575fe91794e | NULL   |
+------+--------+--------+-----------------+------------------------------------------+--------+

JOIN 句と同じようなこともできます。これは、index が含まれているファイル名を変更したコミットを表示しています。

❯  mergestat "select commits.*, files.path from commits,files('',commits.hash) where files.path like '%index%'"
+------------------------------------------+---------------------+-------------+--------------------+---------------------------+----------------+--------------------+---------------------------+---------+------------+
| HASH                                     | MESSAGE             | AUTHOR_NAME | AUTHOR_EMAIL       | AUTHOR_WHEN               | COMMITTER_NAME | COMMITTER_EMAIL    | COMMITTER_WHEN            | PARENTS | PATH       |
+------------------------------------------+---------------------+-------------+--------------------+---------------------------+----------------+--------------------+---------------------------+---------+------------+
| 495fc3d11ccc6681c84f058bcffb1e2dfcf9c42d | Merge branch 'test' | hanako      | hanako@example.com | 2022-12-21T23:05:09+09:00 | hanako         | hanako@example.com | 2022-12-21T23:05:09+09:00 | 2       | index.html |
|                                          |                     |             |                    |                           |                |                    |                           |         |            |
+------------------------------------------+---------------------+-------------+--------------------+---------------------------+----------------+--------------------+---------------------------+---------+------------+
| 73044b4af769c8e54eb048b564ec964a71a6f6f0 | fix index.html      | hanako      | hanako@example.com | 2022-12-21T22:33:46+09:00 | hanako         | hanako@example.com | 2022-12-21T22:33:46+09:00 | 1       | index.html |
|                                          |                     |             |                    |                           |                |                    |                           |         |            |
+------------------------------------------+---------------------+-------------+--------------------+---------------------------+----------------+--------------------+---------------------------+---------+------------+
| ecf4546d02d4ac821177673b6f548895f07b525a | add index.html      | hanako      | hanako@example.com | 2022-12-21T22:33:03+09:00 | hanako         | hanako@example.com | 2022-12-21T22:33:03+09:00 | 1       | index.html |
|                                          |                     |             |                    |                           |                |                    |                           |         |            |
+------------------------------------------+---------------------+-------------+--------------------+---------------------------+----------------+--------------------+---------------------------+---------+------------+
| 4dafff74adf938361a9f5e8c587a0575fe91794e | test                | hanako      | hanako@example.com | 2022-12-21T23:04:59+09:00 | hanako         | hanako@example.com | 2022-12-21T23:04:59+09:00 | 1       | index.html |
|                                          |                     |             |                    |                           |                |                    |                           |         |            |
+------------------------------------------+---------------------+-------------+--------------------+---------------------------+----------------+--------------------+---------------------------+---------+------------+

このように欲しい情報が比較的直感的に出力できます。Git に関する統計を取るときに便利そうです。また、特定のコミットを見つけたいけど、絞り込み条件が入り組むときにも使えそうです。

今回紹介したのは CLI 版ですが、GUI 上でクエリを発行できるプロジェクトもあるそうです(こっちの方がメインかもしれない)

https://github.com/mergestat/mergestat

https://github.com/nschloe/deadlink

deadlink は文章中から期限切れになった URL リンクを見つけてくれるツールです。個人的に Github のアイキャッチ画像が好き。

使い方はシンプルで、確認したいドキュメントを指定するだけです。

コマンドを実行すると次のことがわかります。

  • 3 つの URL のリンクはアクセスできる
  • https://google.com/https://www.google.com/にリダイレクトされる
  • https://github.com/nschloe/deadlink/404は 404 で返ってきている
  • [https://not_exist.google.com](https://not_exist.google.com) はその他の HTTP エラーになっている
cat urls.txt
https://google.com/
https://www.google.com/
http://www.google.com/
https://not_exist.google.com
https://github.com/nschloe/deadlink
https://github.com/nschloe/deadlink/404

❯  deadlink c urls.txt
Found 6 unique URLs in 1 file (ignored 0 files, 0 URLs)
Checking... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00

OK (3)

Successful permanent redirects (1):
   301:   https://google.com/
   → 200: https://www.google.com/

Client errors (1):
  404: https://github.com/nschloe/deadlink/404

Other HTTP errors (1):
  https://not_exist.google.com

また、リダイレクトであった場合に、リンクをリダイレクト先のものに置き換えるようにもできます

cat urls.txt
https://google.com/
https://yahoo.com/

❯  deadlink rr urls.txt
Found 2 unique URLs in 1 file (ignored 0 files)
Checking... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00

Successful permanent redirects (2):
   301:   https://google.com/
   → 200: https://www.google.com/
   301:   https://yahoo.com/
   → 200: https://www.yahoo.com/

Replace those 2 redirects? [y/N] y

❯  cat urls.txt
https://www.google.com/
https://www.yahoo.com/

ドキュメントやブログの公開前の確認として使えそうです。また、CI に組み込んでみても面白そうです。

teip

https://github.com/greymd/teip

teip は sed や awk のような編集コマンドの変更箇所を指定してくれるツールです。例えば、次のように空白区切りで 2 列目の項目を@に変更することができます。

cat test.txt
100 200 300 400
100 200 300 400
100 200 300 400
100 200 300 400
100 200 300 400cat test.txt | teip -f 2 sed 's/./@/g'
100 @@@ 300 400
100 @@@ 300 400
100 @@@ 300 400
100 @@@ 300 400
100 @@@ 300 400

編集コマンドに引き渡さないと、次のように変更箇所が[…]で表示されます。

事前に値が変わる場所を確認できるのはとても便利だと思います。

cat test.txt | teip -f 2
100 [200] 300 400
100 [200] 300 400
100 [200] 300 400
100 [200] 300 400
100 [200] 300 400

行の位置を指定したり

cat test.txt | teip -l 4
100 200 300 400
100 200 300 400
100 200 300 400
[100 200 300 400]
100 200 300 400

外部コマンドから渡された行を指定することができます。次のコマンドは secret と書かれた前後行を@に置き換えます

cat test.txt | teip -e 'grep -n -C 1 secret'
100 200 300 400
100 200 300 400
[100 200 300 400]
[↑secret↓]
[100 200 300 400]
100 200 300 400cat test.txt | teip -e 'grep -n -C 1 secret' sed 's/./@/g'
100 200 300 400
100 200 300 400
@@@@@@@@@@@@@@@
@@@@@@@@
@@@@@@@@@@@@@@@
100 200 300 400

一見すると速度が遅くなる印象がありますが、実際は予想を裏切って teip を介した方が速くなるみたいです。そのまま awk や sed をそのまま実行するよりも、teip を挟むだけで 3〜4 倍ほど高速化されるとのことです。

sleepy

https://github.com/mattn/sleepy

sleepy はより分かりやすくなった sleep コマンドです。指定した時間が経過するまで、プログレスバーが表示されます。

❯  sleepy 10s
[========================>-----------------------------------------]  39%

例えば休憩を行っているときに残り時間が見えることで、急に休憩が終わるのではないかというドキドキ感を味わずにすみます。

echo "Let's take a coffee break" && sleepy 3m && echo "Good luck"
Let's take a coffee break
[=====================>--------------------------------------------]  35%

おわりに

紹介は以上です。まだまだ多くの便利だったり、面白いものがあるので興味のある人はぜひ Github を漁ってみてください。

気に入ったものがあればパッチを送るなどして開発貢献ができれば、とても良いことかなと思っています。私自身はまだまだ全然できていないですが、来年の目標としてチャレンジしたいです。

Discussion

ログインするとコメントできます