たいちょーの雑記

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

第39回シェル芸勉強会大阪サテライトへ参加してきました

参加しました

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

wgetgoogle.comからindex.htmlを取得した後,上の方にある<meta content="...."という要素があるのでここのメッセージを読む問題.

$ cat index.html|sed 's/.\+\(<meta content=.*name="description">\).\+/\1/'|head -n1|awk '{print $2}'|nkf --numchar-input
content="世界中のあらゆる情報を検索するためのツールを提供しています。さまざまな検索機能を活用して、お探しの情報を見つけてください。"

sedheadでほしい部分を取り出してnkf --numchar-inputUnicode参照を変換します.しかし取り出す必要はなく,読めればいいので最初からnkfに通せば良かったみたいですね.

Q4

さっき取得したindex.htmlからscript要素とstyle要素を取り出して,それぞれindex.jsindex.cssに書きだす問題.実用的だな

$ cat index.html|pee 'pup "script json{}"|jq -c ".[].text" > index.js'  'pup "style json{}"|jq -c ".[].text" > index.css'

悪戦苦闘していたのですが,Twitterpupというツールがあるというのを知り,

github.com

これとpeeでなんとかクリアしました.pupめっちゃ便利っすね

Q5

さっきまで使っていたindex.htmlからscriptstyle以外の要素を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

img

一応やってみたんですが崩れてしまいました・・・まぁ読めなくはないし・・・?(苦しい)

LT

www.slideshare.net

github.com

今回もヤバい難読化シェル芸を考えてきました.ワタナベ難読化シェル芸といいます.

きっかけは前回シェル芸勉強会の大阪LT後,配信外で渡る世間はナベばかりという神経衰弱の紹介でした.ぱっと見の難易度の高さからヤバかったのですが,その時「難読化に使えるわこれ」と思った僕もだいぶヤバそうですね

今回作った難読化ツールnocがシェル芸Bot入りしたことと,皆さんにnocで遊んでもらえたのがとてもうれしかったです.

これを考えたのは朝4時の研究室でした.一緒に考えてくれた友人には感謝しています.おかげでヤバい難読化シェル芸ができました.

詳しい説明とかはまた別記事で書きたい気がします.

終わりに

今回も楽しかったです!文字コードパワーとシェルパワーがまた少し上がった気がします.企画・運営をやってくださった皆々様本当にありがとうございました!