しおメモ

雑多な技術系ブログです。ニッチな内容が多いです。

xargsの-Pオプションでコマンドを並列実行する

シェルだけで簡単にコマンドを並列実行するのに、xargs-Pオプションがあります。
GNU Parallelも便利ですが、そちらはmacユーザーだと別途インストールが必要なので、こちらを紹介します。


使い方

xargs -Pn

-Pで並列実行の最大のプロセス数を指定します。
GNU版の場合、-P0で自動で最大限のプロセスを指定してくれますが、macなどBSD版の場合、n>0の制約がついています。

活用例

例1. 一括画像リサイズ

find . -type f -name "*.jpg" | xargs -I@ -P8 convert -resize 100x100 @ @

Imagemagickと組み合わせて、画像を一括リサイズします。

例2. 連番ダミー画像生成

seq 1 100 | xargs -I@ -P8 convert -size 600x600 -pointsize 150 -gravity Center label:No.@ @.jpg

またImagemagickの例になってしまうのですが、大量に画像を生成する時なども効率的です。

例3. 動画の変換

find . -type f -name "*.MOV" | xargs -I@ -P8 ffmpeg -i @ -vf scale=320:-1 -r 15 @.gif

ffmpegとも相性がいいです。

おわりに

簡単な画像処理などは、Photoshopバッチ処理や、Pythonなどで書くよりも断然楽をできると思います。
その他、wgetcurl等と組み合わせて、画像のクローリングなどにも使用できますが、サーバーに負荷がかかってしまうので、その場合はプロセスを増やしすぎるのはお勧めできません。

macのtz databaseが消えたら

一昨日あたり、帰ってきてPCを開いたらシェルの時刻がUTCになってたのですが、原因を調べたところ、Asiaのtz databaseが丸々消えていました(なぜ🤔??)

現象

ls /var/db/timezone/zoneinfo/Asia

何もない(´・ω・`)

/var/db/timezone/zoneinfoからファイルが消えてしまっているので、設定の「日付と時刻」から項目自体は選択できますが、実際には反映されなくなります。
再起動した時にはUTCやロサンゼルス時間など異なる時刻になります。

応急処置

応急処置ですが、/usr/share/zoneinfo.defaultの方にも、おそらくBSD用のものですが、相応のファイルがあるので、こちらをコピーしてきます。

sudo cp /usr/share/zoneinfo.default/Asia/* /var/db/timezone/zoneinfo/Asia

そして、/etc/localtimeシンボリックリンクを貼ります。

sudo ln -sf /var/db/timezone/zoneinfo/Asia/Tokyo /etc/localtime

これで一応は、再起動しても大丈夫です。

帰れないプロジェクトをgitから察知する

あけましておめでとうございます。新年からブラック()なネタです。

基本

git log --pretty='%ai %an' | sort -u -k1,1 | sort -k2 -r | head -20

日ごとに、最終コミットの日時を抽出して、ソートしてワースト20を出力します。

こんな感じ👇

2018-11-16 23:31:59 +0900 Scior
2018-12-09 23:24:22 +0900 Scior
2018-11-14 23:20:11 +0900 Scior
2018-12-13 23:18:00 +0900 Scior
2018-11-13 23:12:08 +0900 Scior
2018-11-30 23:11:14 +0900 Scior
2018-11-12 23:08:47 +0900 Scior

月,年ごと

git log --pretty='%ai %an' | grep 2018-11 | sort -u -k1,1 | sort -k2 -r
git log --pretty='%ai %an' | grep 2018 | sort -u -k1,1 | sort -k2 -r

grepでフィルタリングして、月ごと年ごとに抽出します。

土日出勤

git log --pretty='%aD %an' | grep ^S | sort -u -k1,2 | sort -k4 -r

フォーマットを変えると、SatとSunなので、grep ^Sで拾えます。

残業王決定

git log --pretty='%ai %an' | sort -u -k1,1 | awk '{print($4)}' | sort | uniq -c | sort -r

最後まで残っている回数の多い人を上から表示します。

最後に

健康が一番なので、ヤバいPJからは身を守りましょう💪