本日は第19回シェル芸勉強会だった。福岡でもサテライト会場を開設させていただいた。ちなみに福岡は太宰府では、ももクロの「男祭」コンサートがあっていたようで。移動手段はJRを使ったので、混雑には合わずに助かった。ああ、そういえばハロウィンて??
大阪でもサテライト会場が開催された。詳しくはこちら。
さて、今回も会場の様子を写真に撮ることをすっかり忘れていたわけで・・・なんで忘れてしまうのか?会場は、今回もベータソフト様の貸会議室を利用させていただいた。視聴覚設備も充実して大変ありがたい。
参加者は私を含めて9人だった。大半が初めての方だったため、問題を解くことも大事だが、考え方やコマンドの使い方をサポートしていくことを重要視した。学生さんがいらっしゃったのも良かった。Macな人の方が多かった。
参加者の環境確認や自己紹介の後、イントロとして話をさせていただいた。
www.slideshare.netその後勉強会がスタート。私のパソコンでUSTをプロジェクターに映しながら遠隔参加。今回はHDMI経由で会議室のスピーカーも使って拡声出来たのも良かった。
今回の問題も、なかなかぶっ飛んだ感じで・・・・問題と解答例はこちら。
【問題と解答】第19回シェル芸3周年記念勉強会 | 上田ブログ
まとめはこちら。色んな方の解答例も。
ということで、私なりの解答を載せておくことにする。環境はMacでOSX。あれ?そう言えば今回は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
き、危険シェル芸の香りがする・・と思ったが、要するに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回となり、初心者の方にとっては難しい(私も難しい!)面もあると思う。過去問を解くとか、初心者向けの問題を作って解くとか出来ないかなあと思っている。とりあえずは日付関連の初心者向け?問題を作ってみている。