参加しました
2018/12/22大阪で行われた第39回シェル芸勉強会大阪サテライトへ参加してきました.
午前
今回も鳥海さんによる文字コードについてでした.前回参考文献にあがっていたユニコード戦記を読んでおいたのでどのへんの話かな~と楽しみにしてました.
資料はここで公開されています.今回の話もとっても楽しかったのでアーカイブで見ることをオヌヌメします.
今回からUnicodeについてでした.今回特に印象に残ったのはBOMについてです.
BOMに使われているのは\U+FEFF
ですが,これにはゼロ幅文字が割り当てられていて,データの先頭にあるかどうかでこの値の意味が変わるらしいというのが最悪感でててよかったです
過去にBOMにひどい目にあわされたので恨みからか気づいたらBOMを💣爆破💣して目的の文字列を得る難読化をその場で組んでいました.
# sedでBOMを取り除くことでdateになる文字列を使ってシェル芸してみる $ echo –n 搀愀琀攀|iconv -t utf-16|sed 's/^\xff\xfe//g' date # xxdで見てみる. BOM(fffe)を取り除けばdateになることが分かる $ echo -n 搀愀琀攀|iconv -t utf-16|xxd 00000000: fffe 0064 0061 0074 0065 ...d.a.t.e
まぁこんな感じです.
他にはUTF-32は結合文字のせいで1文字=32bitとはならないというのがまた最悪感あってよかったです.
嬉しいことに次回も文字コードらしいので楽しみですね.
午後
今回も初心者向けの問題セットらしいです.たぶん嘘だと思っていたので裏切られてもあんまりダメージはなかったです.
問題と解答例はここにあります
Q1
wrong.md
というMarkdownファイルの文法ミスをワンライナーで何とかする問題.ここ最近の1問目で一番難しかった気がします.実際時間内に正規表現が書ききれませんでした.
解答例ではsed
の後方参照と最短一致する正規表現をそれそれ~と書くというやつでした.
Q2
attendee.md
のデータを並び替える問題.親の要素は数値,子の要素は開催地でソートするという感じですね.
$ cat attendee.md|sed 's/第\(3[0-9]\)回.*/\1/g'| tr -d '*:'| sed 'y/東京大阪福岡/112233/'| awk 'NF==1{k=$1}NF==2{map[k,$1]=$2}END{ for(i=34;i<38;i++) {print "- 第"i"回シェル芸勉強会";print "福岡: "map[i,33];print "大阪: "map[i,22];print "東京: "map[i,11]}}'| awk 'NF==2{print}' - 第34回シェル芸勉強会 大阪: 16 東京: 19 - 第35回シェル芸勉強会 大阪: 10 東京: 27 - 第36回シェル芸勉強会 東京: 38 - 第37回シェル芸勉強会 福岡: 8 大阪: 10 東京: 21
awk
の配列を使うことにしました.二次元配列の各位置に放り込んで順番に出してるだけですね.
解答例は良い感じに値を付けてあげてsort
コマンドに任せるというやつでした.すげースマート.見習っていきたい
Q3
wget
でgoogle.com
からindex.html
を取得した後,上の方にある<meta content="...."
という要素があるのでここのメッセージを読む問題.
$ cat index.html|sed 's/.\+\(<meta content=.*name="description">\).\+/\1/'|head -n1|awk '{print $2}'|nkf --numchar-input content="世界中のあらゆる情報を検索するためのツールを提供しています。さまざまな検索機能を活用して、お探しの情報を見つけてください。"
sed
とhead
でほしい部分を取り出してnkf --numchar-input
でUnicode参照を変換します.しかし取り出す必要はなく,読めればいいので最初からnkf
に通せば良かったみたいですね.
Q4
さっき取得したindex.html
からscript
要素とstyle
要素を取り出して,それぞれindex.js
とindex.css
に書きだす問題.実用的だな
$ cat index.html|pee 'pup "script json{}"|jq -c ".[].text" > index.js' 'pup "style json{}"|jq -c ".[].text" > index.css'
悪戦苦闘していたのですが,Twitterでpup
というツールがあるというのを知り,
これとpee
でなんとかクリアしました.pup
めっちゃ便利っすね
Q5
さっきまで使っていたindex.html
からscript
とstyle
以外の要素をindex_no_cssjs.html
へ書き出す問題.jq
のなかでうまく否定文が書けなくて四苦八苦してたら時間切れになってしまった...
Q6
index.js
内でエスケープされてる文字を復元する問題
$ echo -e $(echo -e $(echo -e "$(cat index.js)" ))|nkf --numchar-input ...省略...
エスケープを解除するだけならecho
でいいんじゃないかと思ったので重ねてみました.echo
でできないUnicode参照はnkf
で.解答例と一応比較してみます
# 解答例 $ sed 's/\\\\u\(....\)/\&#x\1;/g' index.js | nkf --numchar-input | nkf --numchar-input | sed 's/\\x22/"/g' | sed 's/\\x3d/=/g' | sed 's/\\\\/\\/g'|tr -d \\n|cat - <(echo)|grep -o . > A.txt # 僕の解答 $ echo -e $(echo -e $(echo -e "$(cat index.js)" ))|nkf --numchar-input|grep -o . > B.txt # diff diff A.txt B.txt 2696a2697 > 2879a2881 > 3039a3042 > 3123a3127 > 3124a3129 > 3129a3135 > 3615a3622 > 4494a4502 >
なんか違うらしいので覗いてみます.
# 解答例の2690~2699文字目 $ cat -n A.txt| grep "^ 269." 2690 e 2691 . 2692 f 2693 = 2694 { 2695 } 2696 ; 2697 v 2698 a 2699 r # 僕の解答の2690~2699文字目 $ cat -n B.txt| grep "^ 269." 2690 e 2691 . 2692 f 2693 = 2694 { 2695 } 2696 ; 2697 2698 v 2699 a
;
の後にスペースがあるみたいですね.他もそんな感じだったので,十分echo
でよさそうですね
Q7
table.md
内にあるMarkdownで書かれた表の縦横を変換する問題.
$ cat table.md|sed 's/|\|-\|://g'|sed '/^$/d'|awk '{x[1]=x[1]"|"$1;x[2]=x[2]"|---";x[3]=x[3]"|"$2;x[4]=x[4]"|"$3}END{for(k in x) print x[k]"|"}' |回|38回|37回|36回|35回|34回|33回|32回|31回|30回|29回| |---|---|---|---|---|---|---|---|---|---|---| |年月|201811|201809|201807|201804|201803|201801|201712|201710|201708|201706| |人数|37|39|38|37|35|40|39|37|46|55|
愚直に書きました.awk
に各要素を整形しながら詰めていってEND{}
で出力しています.tateyoko
とかrs -T
を使ってもよかったんですが,ぱっと思いついたので
Q8
yabatanien
というファイルの色を変化させ続けてください.何を言ってるんだ・・・・
問題設定に変なのがない(Q1除く)ので安心しきっていたんですが,終わりの時間に爆弾が来て放心状態になりました.
$ cat yabatanien|while read L; do x=$(echo {0..9}|xargs -n1|shuf -n1); echo -e $L|sed "s/9[0-9]m/9${x}m/g"; done
一応やってみたんですが崩れてしまいました・・・まぁ読めなくはないし・・・?(苦しい)
LT
今回もヤバい難読化シェル芸を考えてきました.ワタナベ難読化シェル芸といいます.
きっかけは前回シェル芸勉強会の大阪LT後,配信外で渡る世間はナベばかりという神経衰弱の紹介でした.ぱっと見の難易度の高さからヤバかったのですが,その時「難読化に使えるわこれ」と思った僕もだいぶヤバそうですね
今回作った難読化ツールnoc
がシェル芸Bot入りしたことと,皆さんにnoc
で遊んでもらえたのがとてもうれしかったです.
これを考えたのは朝4時の研究室でした.一緒に考えてくれた友人には感謝しています.おかげでヤバい難読化シェル芸ができました.
詳しい説明とかはまた別記事で書きたい気がします.
終わりに
今回も楽しかったです!文字コードパワーとシェルパワーがまた少し上がった気がします.企画・運営をやってくださった皆々様本当にありがとうございました!