難読化dateしましょう
難読化dateコレクション、略して難daコレは難読化された date
コマンド(略して難da)を集めた聖典です
dateコマンド
$ date 2019年 12月 11日 水曜日 20:31:43 JST
見ての通り日付を出力するツール。coreutils
に入っている。
PowerShellにも Get-Date
なるものがある。PowerShellだと、 Get
を取ってもいいのと、大文字小文字が関係ないことから同じように date
で日付が得られる。
# powershell $ Get-Date 2019年12月11日 20:35:30 $ date 2019年12月11日 20:35:30
PNGChunk利用難da
$ convert -size 1x1 xc:white png:-|strings|grep -aoP "....(?=:)"|bash 2019年 12月 16日 月曜日 22:44:02 JST
convert
コマンドでPNG画像を生成。convert
が付加してくれてるChunkを利用する方法
動作確認した環境
$ bash --version GNU bash, バージョン 5.0.11(1)-release (x86_64-pc-linux-gnu) Copyright (C) 2019 Free Software Foundation, Inc. ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html> This is free software; you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.
$ zsh --version zsh 5.7.1 (x86_64-debian-linux-gnu)
- convert
$ convert --version Version: ImageMagick 6.9.10-23 Q16 x86_64 20190101 https://imagemagick.org Copyright: © 1999-2019 ImageMagick Studio LLC License: https://imagemagick.org/script/license.php Features: Cipher DPC Modules OpenMP Delegates (built-in): bzlib djvu fftw fontconfig freetype heic jbig jng jp2 jpeg lcms lqr ltdl lzma openexr pangocairo png tiff webp wmf x xml zlib
$ grep --version grep (GNU grep) 3.3 Copyright (C) 2018 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Written by Mike Haertel and others; see <https://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.
解説
難daをパイプで分解します。
1: convert -size 1x1 xc:white png:- 2: strings 3: grep -aoP "....(?=:)" 4: bash
1: convert -size 1x1 xc:white png:-
ImageMagickのconvert
コマンドで画像を生成したり、加工したりできる。
convert
でPNGを作るとき、色んな情報を付加してくれる。例えばこんなの
$ convert -size 1x1 xc:white png:-|strings
IHDR
gAMA
cHRM
bKGD
tIME
IDAT
%tEXtdate:create
2019-12-16T22:31:17+09:00
%tEXtdate:modify
2019-12-16T22:31:17+09:00
IEND
ホントはもっとバイナリっぽいんだけどstrings
で読めるところだけ出力している。
出力を見てもらうとわかるのだけど EXtdate:create
という行と EXtdate:modify
という行がある。今回はこれを利用してdate
を発動させる。
ちなみにこの付加情報は-strip
や-define png:exlude-chunk=value
で削除できる。明示的に付加したいときは-define png:include-chunk=value
を使えば良い。
ともあれ、この難daではサイズが1x1な白単色の画像をSTDOUTに出力している。-size 1x1
がサイズ指定、xc:white
が白指定になる。
2: strings
バイナリを読むときとかに使いがちな strings
。この難daで使っているのは上の節でやったような「読めるところだけ取り出す」なので説明はない…
3: grep -m1 -oP "....(?=:)"
grep
で ....:
という文字列を引っ掛ける。
正規表現中の(?=:)
というのは先読みの一種で、xyz(?=a)
という正規表現は xyza
にマッチし、一致箇所として xyz
を返す。
$ echo -e "1:xyza\n2:xyzt" 1:xyza 2:xyzt $ echo -e "1:xyza\n2:xyzt" |grep -oP "[0-9]:xyz(?=a)" 1:xyz
この難daでは ....(?=:)
で 任意の四文字の後に:が来る
部分を取り出してる。すると一番最初のマッチが date
になるので -m1
で1つマッチしたら終了している。
4: bash
いうことなし!!
おわりに
今回は、何回か前のシェル芸勉強会でconvert
を頑張って使う問題が結構あったときからちょいちょい小出しにしていた難daでした。これまではsed
とかで切り出していたんですが、先日正規表現の ?=pattern
を学んだので、これを利用しつつ新たにやってみました。結構短めで気に入っています