「第37回シェル芸勉強会 大阪サテライト」の備忘録

2018年9月1日に開催された「第37回シェル芸勉強会 大阪サテライト」の記録です。

現在、公私ともに多忙なこともあって、この記事は自分にとっての単なる備忘録でしかありませんが、少しでも目を通していただければ幸いです。


午前の部:

シェルで文字コードに触れてみる その2

  • 講師:
    • 鳥海秀一(@hid_tori)さん(USP友の会)

当日の朝は母の認知症の容体が思わしくなかったため、残念ながら午前の部に参加することはできませんでした(会場スタッフおよび参加者の皆さんにはご迷惑をおかけしました)。

後日に動画およびスライドを閲覧して、EBCDICおよびそのバリエーションの多さと文字コード変換ツールiconvの使用例を知ることができました。

EBCDICといえばメインフレームで使われる文字コードであること程度しか知らなかった自分にとり、この講義は前回に続きインフラとしての文字コードについて学ぶ上で非常に有益なものだと感じました。

ちなみに、Perl周辺に限った話にはなりますが、perldoc perlebcdicしてもEBCDICについて知ることができます。


午後の部:

使用コマンド:

解答でanimationおよびimgoutコマンドを使ったものがありますが、これらはImageGeneratorForShBotをインストールすると使うことができます。

なお、これらのコマンド(シェルスクリプト)をローカルで使用する際には、あらかじめ

  1. 各コマンドのソースコードの末尾にあるファイルの生成先ディレクトリを/imagesから/tmpに変更
  2. VL GothicフォントSymbolaフォントをインストール

しておくと良いと思います。

また、Q7Q8の解答にはmatsuyaコマンドが必要になりますので、matsuya-generator-rubyの説明を参考にしてインストールしてください。

A1:

N=1; while :; do clear; echo $N | awk '$1%15==0{printf "%8s\n","FizzBuzz";exit}$1%5==0{printf "%8s\n","Buzz";exit}$1%3==0{printf "%8s\n","Fizz";exit}{printf "%8s\n",$1;exit}'; N=$((N+1)); sleep 1; done
(...出力略...)

animationを使った別解は次の通りです。

$ seq 100 | sed '3~3s/.*/Fizz/;5~5s/.*/Buzz/;15~15s/.*/FizzBuzz/' | awk '{printf "%8s\n",$1}' | sed 's/  / /g' | animation

A1の別解による出力

animation(およびimgout)の内部で使われているconvertは先頭および末尾の半角スペースを認識しないため、あらかじめ半角スペース2個を全角スペースに置換しておく必要があります。

A2:

※端末およびフォントの環境設定によっては、表示がずれる場合があります。

$ perl -E 'for($i=4;$i>0;$i--){if($i==2){say " "x$i."/"." 👁  "."\\"}else{say " "x$i."/"." "x((4-$i)*2)."\\"}};say " ̄"x5'
    /\
   /  \
  / 👁  \
 /      \
 ̄ ̄ ̄ ̄ ̄

A3:

$ seq 111 999 | grep -v 0 | sed 's/./& /g' | awk '$1+$2+$3==15' | tr -d ' ' | xargs
159 168 177 186 195 249 258 267 276 285 294 339 348 357 366 375 384 393 429 438 447 456 465 474 483 492 519 528 537 546 555 564 573 582 591 618 627 636 645 654 663 672 681 717 726 735 744 753 762 771 816 825 834 843 852 861 915 924 933 942 951

A4:

$ perl -C -E 'say "\N{MAHJONG TILE EAST WIND} "x3 ." "."\N{MAHJONG TILE SOUTH WIND} "x3 ." "."\N{MAHJONG TILE WEST WIND} "x3 ." "."\N{MAHJONG TILE NORTH WIND} "x3 ." "."\N{MAHJONG TILE WHITE DRAGON} "x2'
🀀 🀀 🀀  🀁 🀁 🀁  🀂 🀂 🀂  🀃 🀃 🀃  🀆 🀆

imgoutを使った別解は次の通りです。

perl -C -E 'say "\N{MAHJONG TILE EAST WIND}"x3 ." "."\N{MAHJONG TILE SOUTH WIND}"x3 ." "."\N{MAHJONG TILE WEST WIND}"x3 ." "."\N{MAHJONG TILE NORTH WIND}"x3 ." "."\N{MAHJONG TILE WHITE DRAGON}"x2' | imgout -f Symbola

A4の別解による出力

A5:

$ echo ICAgIOWxsSAgICAKICAgIOWxsSAgICAKICAgIOWxsSAgICAK5bGxICDlsbEgIOWxsQrlsbHlsbHlsbHlsbHlsbEKICAgICAgICAgIArivaXivaXivaXivaXivaUK4r2lICDivaUgIOK9pQrivaXivaXivaXivaXivaUK4r2lICDivaUgIOK9pQrivaXivaXivaXivaXivaUK | base64 -d
    山
    山
    山
山  山  山
山山山山山

⽥⽥⽥⽥⽥
⽥  ⽥  ⽥
⽥⽥⽥⽥⽥
⽥  ⽥  ⽥
⽥⽥⽥⽥⽥

A6:

$ echo cHJpbnRmICdfX1lfX1xuX19EX19cbl9fWV9fXG5ZX0RfWVxuRFlEWURcbl9fX19fXG5EWURZRFxuWV9EX1lcbkRZRFlEXG5ZX0RfWVxuRFlEWURcbicgfCBzZWQgJ3kvX1lEL+OAgOWxseeUsC8nCg== | base64 -d | sh
  山  
  田  
  山  
山 田 山
田山田山田
     
田山田山田
山 田 山
田山田山田
山 田 山
田山田山田

なお、base64で難読化されている部分は次のようになっています。

$ echo cHJpbnRmICdfX1lfX1xuX19EX19cbl9fWV9fXG5ZX0RfWVxuRFlEWURcbl9fX19fXG5EWURZRFxuWV9EX1lcbkRZRFlEXG5ZX0RfWVxuRFlEWURcbicgfCBzZWQgJ3kvX1lEL+OAgOWxseeUsC8nCg== | base64 -d
printf '__Y__\n__D__\n__Y__\nY_D_Y\nDYDYD\n_____\nDYDYD\nY_D_Y\nDYDYD\nY_D_Y\nDYDYD\n' | sed 'y/_YD/ 山田/'

A7:

$ matsuya | mecab -Oyomi | nkf --hiragana | toilet | awk '{L[NR%8]=L[NR%8]$0}END{for(i=0;i<=8;i++)print L[i]}' | imgout

A7による出力

A8:

$ matsuya | perl -C -nlE 'use utf8;$l=length;say;for($i=2;$i<$l;$i++){say substr($_,$i-1,1)." "x($l-2).substr($_,$l-$i,1)};say(scalar reverse)'
プレミアム牛めし
レ      め
ミ      牛
ア      ム
ム      ア
牛      ミ
め      レ
しめ牛ムアミレプ

LT大会:

CLIツール作るの楽しい

fzfpecoのようなCLI用あいまい検索ツールと組み合わせてcdコマンドを強化するcdx(golang版)の開発についての発表です。

ラズパイ用シェルスクリプトで監視カメラもどきを作る

タイトル通り、Raspberry Piで監視カメラを作るためにシェルスクリプト(ソースコード)を書いたという発表です。

参考リンク:


Thanx:

Written on September 19, 2018