第37回シェル芸勉強会@大阪サテライトに参加しました
(^o^)/
(^-^)
午前の部
鳥海さんによる文字コードについての講義。難読化シェル芸のネタが転がっているかも知れないので楽しみでした。講義中は2重forのシェル芸がいきなり出てきたりかなり激しめでしたね。
今回の講義で一番印象に残ったのはiconvでcp930とcp939を行ったり来たりするところでした。例えば
$ echo スリスリ| iconv -f utf-8 -t cp930 | iconv -f cp939 -t utf-8 ヌメヌメ
というふうにテーブルを変えることで別の意味に変換できたりします
これは難読化に簡単に応用できて
$ echo オイヤカ | iconv -f utf-8 -t cp939 | iconv -f cp930 -t utf-8 | bash 2018年 9月 1日 土曜日 16:08:40 JST
オイヤカという文字列をdateに変換できます。もう少し何か工夫すれば複雑な難読化シェル芸ができるかも知れませんね
午後の部
今回も午後はヤバイ問題をいっぱいときました。
開始宣言が「地獄の始まり」とのことだったのでやる前からフラフラでした
問題はこちら
Q1
FizzBuzzを表示するgifアニメーションを作りなさい。
seq 100 | sed -e '3~3cFizz' -e '5~5cBuzz' | sed '15~15cFizzBuzz' | animation
animation
はシェル芸botに実装されているgifアニメを作ってくれるコマンドです。ソースを読むと何をしているかわかります
Q2
プロヴィデンスの目のAAを作りなさい。
seq 4|awk '{for(i=0;i<4-$1;i++)printf " ";printf "/";for(i=0;i<$1*2-2;i++)printf " ";print "\\"}'|cat - <(echo  ̄ ̄ ̄ ̄)| sed 's|/ \\|/ 目 \\|'
愚直にawk
でfor
を回します。特筆するところはないですね
Twitterでみた東映版が面白かったので自分のやつでもやってみました。
seq 5|awk '{for(i=0;i<5-$1;i++)printf " ";printf "/";for(i=0;i<$1*2-2;i++)printf " ";print "\\"}'|cat - <(echo  ̄ ̄ ̄ ̄ ̄)| sed '3s| | 東 |;4s| | 映|'
Q3
以下の条件を満たす数字を全部出力しなさい
- 3桁の数
- 桁和が15
- 0を含まない
- 同じ数字を含まない
競プロとかに出てきそうな問題だと思いました
seq -w 999|awk '{print $1,$1}'| sed -E 's/(.)(.)(.)/echo $((\1+\2+\3))/e'| grep -v 0|awk '$1==15{print $2}' | grep '\(.\).*\1' -v | xargs
最初のsed
で桁和を計算しています。その後0
を含む行をgrep
で排除し、awk
で桁和が一致する数をとりだした後、grep
で同じ文字が存在しない行だけ取り出して終わります。
最後のgrep
はカンニングしました・・・。聞けば前回やっていたそうなので身についてないな〜と反省しました。精進精進
Q4
役満を出力してください
麻雀はわからないので役満もわからないのですがとりあえず例になっていたのを真似ました。
cat <(yes "+--+"|head -n14|xargs) <(echo -e "東\n東\n東\n南\n南\n南\n西\n西\n西\n北\n北\n北\n \n "|sed 's/./|&|/g'|xargs) <(yes "+--+"|head -n14|xargs)
牌をAAで表現しました。やってる事自体は全然難しくないようですが、想定解とは全然違ったみたいですね・・・
Q5
山 山 山 山 山 山 山山山山山 ⽥⽥⽥⽥⽥ ⽥ ⽥ ⽥ ⽥⽥⽥⽥⽥ ⽥ ⽥ ⽥ ⽥⽥⽥⽥⽥
を出力してください。なんやねんこれ・・・
echo -n "1f8b080028288a5b00037bdcd0f0b8a1e1e9c68d8fc18cc778b910069c44 43c85a80e8d1dea568082288550abf2c00a1eea7afa5000000" | xxd -ps -r | gunzip|grep -o .|xargs -n5|tr -d ' '
難読化すればするほど良いですとのことだったので gunzip
を使ってみました。全角のスペースで埋めて gzip
圧縮したものを gunzip
に通して xargs
でまとめただけですね
Q6
山 田 山 山 田 山 田山田山田 田山田山田 山 田 山 田山田山田 山 田 山 田山田山田
この出力を得てください。アハハ
echo -n "1f8b08009c298a5b00037bdcd0f0b8a1e1e9c68d8fc10c087a3e65033217 2e0b614064816c20039944d602448ff62e058a23931041885efcb21033e1 b200ebf8a623a5000000 " | xxd -ps -r | gunzip|grep -o .|xargs -n5|tr -d ' '
さっきの解答の入力を変えただけです。それだけだと面白くないので以下の難読化も試してみました。
eval $(echo -n "1f8b0800d52a8a5b00034b4dcec85778dcd000444f376e843020e8f9940d c85cb82c84019105b2810c6412590b103ddabb14288e4c4204217af1cb42 cc84cbd6a417a51628e8e62be8d5542416a5172be8e699d6941429e8a628 a82ba8030053a9f2f8c8000000"|xxd -ps -r|gunzip)
これも gunzip
を使ったやつです。これは僕が少し前にLTしたやつですね。
eval
を外すとどうなるかと言うと
$ echo -n "1f8b0800d52a8a5b00034b4dcec85778dcd000444f376e843020e8f9940d c85cb82c84019105b2810c6412590b103ddabb14288e4c4204217af1cb42 cc84cbd6a417a51628e8e62be8d5542416a5172be8e699d6941429e8a628 a82ba8030053a9f2f8c8000000 echo 山 田 山 山 田 山田山田山田 ⽥山⽥山⽥山 ⽥ 山⽥山⽥山⽥山 ⽥ 山田山⽥山⽥|grep -o .|xargs -n5|tr -d ' '
解答を生成するワンライナーが仕込まれています。最近の難読化シェル芸の発展を見るとちょっとおとなし目な難読化ですね
Q7
matsuya
コマンドで生成されたメニューをひらがなに変換して toilet
に通した後、1行に連結し画像に落とし込む問題。手順が多すぎる。
途中までしか出来ませんでした・・・1行にまとめるところが出来なかった。
$ matsuya|mecab| awk -F, '{print $1,$6}'|awk 'NF==3{print $3=="*"?$1:$3}'|xargs|toilet
Q8
matsuya
コマンドの出力を使って以下のようにしてください
例) 鉄皿鶏のチリソース定食だったとき
鉄皿鶏のチリソース定食 皿 定 鶏 ス の ー チ ソ リ リ ソ チ ー の ス 鶏 定 皿 食定スーソリチの鶏皿鉄
上下左右が逆になっていることが難しいポイントですね。
c="$(matsuya)";cat <(echo $c) <(paste <(echo $c|sed 's/.\(.\+\)./\1/'|grep -o .) <(echo $c|sed 's/.\(.\+\)./\1/'|grep -o .|tac)) <(echo $c|rev)|column -t|sed 's/ \(.\)$/\1/g'
ちょっとセコいんですが変数にメニューを保存しておきます。あとは天井と床、左右の壁を作って cat
に順番に流し込みます。
面倒なのは左右の壁だけなので、そこだけ解説します。
1文字目と最後の文字を削って、縦に並べて paste
で連結します。天井、床と合わせてこれを column
で幅を取るといい感じに並びます。
$ c="$(matsuya)";cat <(echo $c) <(paste <(echo $c|sed 's/.\(.\+\)./\1/'|grep -o .) <(echo $c|sed 's/.\(.\+\)./\1/'|grep -o .|tac)) <(echo $c|rev) きつねうどん つ ど ね う う ね ど つ んどうねつき
このスキマはちょうど半角スペース4つ分なので sed
で削って終わりですね
awkの中でpipe
この問題の解答のなかでawk
の中でコマンドを実行できるというのを知りました。すげーっすねこれ・・・
$ echo abc | awk '{print | "rev"}' cba
LT
今回は新しい難読化シェル芸についてでは無いですが、宣伝をしようと思いまして発表させていただきました。
www.slideshare.net
cdx
という cd
コマンドのラッパーを作ったのでその宣伝をしました。因みにスライド内で言っている海外は体調不良で断念して今布団の上でコレを書いています。しんどいわホンマ
そんなことより cdx
をよろしくお願いたします。
github.com
xztaityozx.hatenablog.com
終わりに
今回も午前午後、LT大会ぜんぶとても楽しかったです。皆様ありがとうございました!!