日々之迷歩

世の中わからんことだらけ

ITが複雑で難しくなっていく様に翻弄される日々です。微力ながら共著させていただいた「シェル・ワンライナー160本ノック」をよろしくお願い申し上げます。

第19回シェル芸勉強会へ遠隔参加

本日は第19回シェル芸勉強会でした。福岡でもサテライト会場を開設させていただきました。ちなみに太宰府では、ももクロの「男祭」コンサートがあっていたようですが、移動手段はJRを使ったので混雑には遭遇しませんでした。ああ、そういえばハロウィンなんてイベントもあるようです。

問題作成と解説の上田さん、会場ご担当者の方、ありがとうございます。参加者の皆様お疲れ様でした。

勉強会の情報

問題と解答

勉強会主催者の上田さんが公開されているページをご覧ください。 b.ueda.tech

会場開催の通知

大阪でもサテライト会場が開催されたようです。

kunst1080.hatenablog.com

さて、今回も会場の様子を写真に撮ることをすっかり忘れておりました。 会場は今回もベータソフト様の貸会議室を利用させていただきました。視聴覚設備も充実して大変ありがたいです。

sites.google.com

まとめはこちら。色んな方の解答例も。

togetter.com

開始前

参加者は私を含めて9人でした。大半が初めての方だったため、問題を解くことも大事だが、考え方やコマンドの使い方をサポートしていくことを重要視しました。学生さんがいらっしゃったのも良かったですね。macOSな人の方が多かったです。

参加者の環境確認や自己紹介の後、イントロとして話をさせていただきました。

www.slideshare.net

勉強会開始

私のパソコンでUSTをプロジェクターに映しながら遠隔参加しました。 今回はHDMI経由で会議室スピーカーで拡声出来たのも良かったです。

私なりの解答を記載いたします。環境はmacOSで作成しました。今回はTukubaiコマンドは全然使いませんでした。

Q1

いきなりギブアップでした。福岡サテライトでは、端末と連動しているかどうかとかで出来るか?という意見も出ました。 ワンライナーとシェルスクリプトの場合で、環境変数に違いがあるのか?というので下記を試してみましたが、 これがQ7で使われる環境変数に関係するとは思いませんでした。

$ cat env.sh 
#!/bin/sh
env

$ diff <(env | sort) <(./env.sh | sort)
14c14
< SHLVL=1
---
> SHLVL=2

$2

続いてギブアップです。1から4まで出力ならこんな感じなのですが。

$ echo 1 4 | sed 's/^/{/' | sed 's/$/}/' | sed 's/ /../' | sed 's/^/echo /' |  bash | tarr
1
2
3
4

勉強会終了後に考えたawk芸です。

$ echo 1 4 | awk '{for(i=$2;i>=$1;i--){print i}for(i=$1+1;i<=$2;i++){print i}}'
4
3
2
1
2
3
4

Q3

解けた!?けど処理がぜんぜん終わりません・・・ので未確認です。愚直過ぎて遅すぎる、何の工夫もない解答です。 遅すぎるのでちゃんとした解答とは言えません。

$ gseq -w 0000000000 999999999 | ggrep '0$' | ggrep '1234567890'

Q4

またもやギブアップです。改行全除去なら簡単なのですが。 $ cat Q4 | tr -d '\n' | sed 's/すっとこどっこい/朴念仁/g' この朴念仁すこっとどっこいすっとこ朴念仁どっこいどっこいすっとこどっこん朴念仁 下記のようにしてやればよさそうだが、頑張るの部分がわかりませんでした。 出題者上田さんの解答例を見たら、もうチョイでしたね。

$ cat Q4 | tr '\n' 'a' | sedで頑張る | tr 'a' '\n'

Q5

何とか解けましたよ。BASE64エンコードしてHTMLに画像が埋め込まれてるのって初めて見た気がします。 <img src=で始まる行を抽出して、BASE64エンコードされた画像部分を切り出せば良いですね。

$ curl https://blog.ueda.asia/?page_id=7123 | gsed 's/<img src=/\n&/g'| grep '^<img src=' | sed -n 3p | sed 's@<img src="data:image/png;base64,@@' | sed 's;"/></p>;;' | base64 --decode > image.png

Q6

8ビットずつバイト列に戻して、nkfで文字コード変換の流れです。awkにLANG=Cを付ける必要があります。

$ cat Q6 | grep -o '........' | ( echo ibase=2; cat ) | bc | LANG=C awk '{printf "%c", $1}' | nkf -w
各地に多種多様な賭博が存在する。
特に有名なものは野球賭博である。

Q7

シェルが起動している深さの変数SHLVLを100にする問題。変数自体はQ1でたまたま見つけたやつですね。

要するにbashをサブシェルとして次々に99回起動しちゃえばいいんじゃないか?ということで、こんな解答を考えました。 出題者上田さんの解答ページにも採用していただきました。ありがとうございます。

$ yes 'bash' | head -n 98 | (cat; echo 'echo $SHLVL') | bash
100

bashの階層を深くしすぎたら、危険シェル芸っぽくなってしまいました・・・

$ yes 'bash' | head -n 598 | (cat; echo 'echo $SHLVL') | bash
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: Resource temporarily unavailable
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: retry: No child processes

Q8

ぎ、ぎぶあっぷです・・・

これがなぜ危険なのかとか、xargsの使い方とか、羊を1秒毎に100匹数えるシェル芸の話をしました。

終了後

終わった後も色々をお話が出来て良かったですね。 皆さんIT系の方ではありますが、色んな立場の方々でした。皆さんの刺激になる勉強会になってたらいいなあと思います。

シェル芸勉強会も19回となり、初心者の方にとっては難しい(私も難しい!)面もあると思います。 過去問を解くとか、初心者向けの問題を作って解くとか出来ないかなあと思っています。 とりあえずは日付関連の初心者向け?問題を作っています。