シェル芸勉強会に参加しました

シェル芸勉強会に参加しました

2018/09/01に開催された

jus共催 第37回シェル芸bot生きてるかどうか分からないけどシェル芸bot向けシェル芸勉強会

に午前・午後の両方とも参加しました.

問題はこちら

午前

午前中は 鳥海さん による シェルで文字コードに触れてみるその2 でした. スライドは こちら

内容は 前回 から続くものであり, シェル上で様々な文字コードを行ったり来たりするものでした. 具体的には,xxd コマンドを用いて文字コードを取得し,iconv コマンドで別のコードへと変換する. といったことを UTF-8, ASCII, EBCDIC, ISO/IEC 646, EUC などを対象に行いました.

わかってしまう人にはわかってしまう内容であり,実際に会場に来ていた人からはスライドが変わるたびに ため息や納得するような声が上がっていました.

午後

午後の問題は シェル芸BOT映え な問題が多数出題されました. ゴリゴリとパズル的に文字を配置していくタイプの問題ですね. 問題を解いていく中で,

  • sedt コマンド
  • 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さんの書いたワンライナーを自分なりに解釈

setopt braceccl をつけると思ったとおりに動いた.

kaworu.jpn.org

zsh -c 'setopt braceccl ;r=({0-9} {A-F});c=({0-9} {A-F});echo ${^r}${^c}' | xargs -n16

参考文献・リンク