シェル芸勉強会に参加しました
シェル芸勉強会に参加しました
2018/09/01に開催された
jus共催 第37回シェル芸bot生きてるかどうか分からないけどシェル芸bot向けシェル芸勉強会
に午前・午後の両方とも参加しました.
問題はこちら
午前
午前中は 鳥海さん による シェルで文字コードに触れてみるその2 でした. スライドは こちら.
内容は 前回 から続くものであり,
シェル上で様々な文字コードを行ったり来たりするものでした.
具体的には,xxd
コマンドを用いて文字コードを取得し,iconv
コマンドで別のコードへと変換する.
といったことを UTF-8, ASCII, EBCDIC, ISO/IEC 646, EUC
などを対象に行いました.
わかってしまう人にはわかってしまう内容であり,実際に会場に来ていた人からはスライドが変わるたびに ため息や納得するような声が上がっていました.
午後
午後の問題は シェル芸BOT映え な問題が多数出題されました. ゴリゴリとパズル的に文字を配置していくタイプの問題ですね. 問題を解いていく中で,
sed
のt
コマンドawk
中でパイプを使っても良い
は,新しく知れて良かったです.
これで,b
コマンドで無限ループさせて
head
コマンド等で必要な分だけ取る
以外の手法を取ることができるようになりました.
自分のために書いておくところ
鳥海さんがゴリゴリ書いていた EBCDIC
のコード表を出すワンライナー
for((i=4;i<16;i++));do printf '\t%02X' $(( i*16));done;echo;for((j=0;j<16;j++));do printf '%02X' $j;for((i=4;i<16;i++));do printf '\t';printf '%02X' $((i*16+j))|xxd -p -r|iconv -f ebcdic-jp-e -t utf8 -c;done;echo;done
整形
# 列アドレスを出す for ((i = 4; i < 16; i++)); do printf '\t%02X' $((i * 16)) done echo for ((j = 0; j < 16; j++)); do # 行アドレスを出す printf '%02X' $j # アドレスに対応する ebcdic-jp-e の文字を出す for ((i = 4; i < 16; i++)); do printf '\t' printf '%02X' $((i * 16 + j)) | xxd -p -r | iconv -f ebcdic-jp-e -t utf8 -c done echo done
鳥海さんが書いていった順番を思い出しながら書く
- 列アドレスを出す
for((i=4;i<16;i++)); do printf '\t%02X' $((i*16));done; echo
- 行アドレスを出す
for((i=4;i<16;i++)); do printf '\t%02X' $((i*16));done; echo; for((j=0;j<16;j++)); do printf '%02X' $j;echo; done
- 行・列に対応した値を出す
for((i=4;i<16;i++)); do printf '\t%02X' $((i*16));done; echo; for((j=0;j<16;j++)); do printf '%02X' $j;for((k=4;k<16;k++)); do printf '\t'; printf '%02X' $((k * 16 + j)); done; echo; done
- 対応した値を
EBCDIC
の値に直して出力する
for((i=4;i<16;i++)); do printf '\t%02X' $((i*16));done; echo; for((j=0;j<16;j++)); do printf '%02X' $j;for((k=4;k<16;k++)); do printf '\t'; printf '%02X' $((k * 16 + j)) | xxd -p -r | iconv -f ebcdic-jp-e -t utf-8 -c; done; echo; done
ぬるシェルなのかな?
ebanさんの書いたワンライナーを自分なりに解釈
zsh -c 'hex=({0..9} {A..F});echo ${^hex}${^hex}' | xargs -n16#シェル芸
— eban (@eban) 2018年9月1日
setopt braceccl
をつけると思ったとおりに動いた.
zsh -c 'setopt braceccl ;r=({0-9} {A-F});c=({0-9} {A-F});echo ${^r}${^c}' | xargs -n16