たいちょーの雑記

ぼくが3日に一度くらい雑記をかくところ

第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
201891日 土曜日 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|/    \\|/ 目 \\|'  

愚直にawkforを回します。特筆するところはないですね

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したやつですね。

www.slideshare.net

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大会ぜんぶとても楽しかったです。皆様ありがとうございました!!