第26回シェル芸勉強会へ遠隔参加
福岡市内に繰り出すと大勢の人で賑わっていました。これが世に言うクリスマスといふイベントらしいです。そんな中向かっていくのは天神にあるAIP Cafe。そう、今日はシェル芸勉強会です。福岡サテライト会場に合計7人の参加者が集まりました。 問題出題と解説の上田さん、ありがとうございます。参加者の皆様お疲れ様でした。
勉強会の情報
勉強会主催者の上田さんが公開されているページをご覧ください。
午前の部
午前の部は超絶ワンライナーで有名な鳥海さんが担当されました。 今回はシェルのインタラクティブな機能についての話でした。 知っている内容はそこそこありましたが、再認識になりました。また知らないことも色々ありました。 参加者の方には、私の方からも改めて説明させていただきました。 シェル芸勉強会ではシェルそのものの話題が少ない気がするので、なんだか新鮮なイメージでした。
- bashのviモードやemacsモード
- Ctrl-sで端末停止、Ctrl-qで復帰など
- タブそのものの入力にはCtrl-vの後等
- Ctrl-rでの後方インクリメンタルサーチ
- Ctrl-dは入力データ終了(End of File)
stty -a
でCtrl-sなどに割り当てられている端末制御文字の確認bind -P
でシェルの操作に割り当てらているキーバインドの確認
福岡サテライトで、Ctrl-dでデータ終了という点で補足の説明をしました。 シェルもOSから見たらプログラムの一つに過ぎず、標準入力から入力されるのを待っている状態であることや、設定次第ではCtrl-dを入力するとログアウトしてシェルが終了してしまう、などです。
bashにはignoreeof
という設定があり、有効な場合はEOFつまりCtrl-dを入力してもログアウトしません。設定は下記のようにset
コマンドで行います。-o
で設定有効、+o
で設定無効になるというのが、直感と反対で初心者殺しな感があります。
## 確認すると無効になっていた $ set -o | grep ignoreeof ignoreeof off ## ignoreeofを有効にする $ set -o ignoreeof ## 確認すると有効になった $ set -o | grep ignoreeof ignoreeof on ## ignoreeofを無効にする $ set +o ignoreeof ## 確認すると無効になった $ set -o | grep ignoreeof ignoreeof off
またTwitterのクライアントアプリやWeb画面では、viのキーバインドが密かに使える話もしました。jk
でTLを上下に移動出来ます。
鳥海さんの話が終わった後、みんなで自己紹介を行いました。初参加の方はBash on WIndowsでの参戦でした。 その後下記イントロの話をさせていただきました。液晶ディスプレイの件をまだ引きずっております・・・
それからシェル芸の歴史についても少し紹介いたしました。
https://blog.ueda.asia/?page_id=8865
昼食
参加者みんなで近くの一風堂にラーメンでも〜と出かけたら、クリスマスなのに長蛇の列です。 別のラーメン店に行きました。以前食べたことがあるお店だったが久々に美味しかったですね。
午後の部
今回はMicrosoft Officeなファイルを扱う内容でした。 東京のペースに合わせながらやるのは無理がありましたので、途中から福岡サテライトのマイペースで進めることにしました。
Q1
最近のMicrosoft Officeのファイルは、実はXMLや画像ファイルをZIPで固めたものです。
福岡サテライト参加者の皆さんは、一同驚きを隠せない様子でした。
unzip
コマンドの使い方や、tree
コマンドでディレクトリツリーの中を見るなどの話もしました。
Q2
スライドの中から「危険」の文字列を探し出して数を数える問題。
まずはZIPを解凍したディレクトリ内をgrep
することをやってもらいました。
次にunzip -p
でファイルを標準出力する方法を解説して、grep
で探してもらいました。
Q3
画像ファイルだけを取り出す問題。
最初は下記のように画像ファイルを1つずつ標準出力に取り出すようなことをやるのか??とか考えていたのですが、そんなことしなくても良いみたいです。
###未完成だよ $ unzip -l 20141019OSC_LT.pptx | grep -E 'gif$|png$|jpg$|jpeg$' | awk '{print "unzip -p",$NF," > images/"$NF}' unzip -p ppt/media/image2.gif > images/ppt/media/image2.gif unzip -p ppt/media/image3.png > images/ppt/media/image3.png (略) unzip -p ppt/media/image5.png > images/ppt/media/image5.png unzip -p ppt/media/image6.gif > images/ppt/media/image6.gif
詳しくは出題者上田さんの解答をご覧ください。
unzip
の-d
オプションを使う下記の例も参考になりました。展開する先のディレクトリを指定出来るんですね。
Q3:
— くんすと (@kunst1080) 2016年12月25日
unzip -d img 20141019OSC_LT.pptx "*.jpg" "*.png"; zip -r https://t.co/rZhWVOg9WV img#シェル芸
Q4
Q4以降は東京のペースで進めるのは困難だったため、福岡サテライトのペースで進めることにしました。 まずはデータをじっくり確認し、不完全ではあるがとりあえずの解答を出しました。完全には解けなくても勘所を押さえるようにしたつもりです。
$ unzip -p 20141019OSC_LT.pptx ppt/slides/slide7.xml | gsed 's/<a:p>/\n&/g' | grep '^<a:p>' | sed 's;<[^<>]*>;;g' 戦果(?) 初日だけで見知らぬ方のマシン3台轟沈 その他自爆者多数 Docker上で試したらホストマシン沈黙の報告 自分の本がサイト経由で1冊だけ売れた フォロワーが1人減った 2014/10/19 OSC Tokyo/Fall 2014 7
最後にタグを取り去るsed 's;<[^<>]*>;;g'
のところで、正規表現の最長一致についても説明しました。
## タグだけ消すつもりが行全体が消えてしまう。行頭の < から行末の > まで一致してしまい全消去された $ echo '<td>1</td><td>2</td>' | sed 's;<.*>;;g' ## [^<>]* というふうに<>以外の文字と明示的に指定すればタグだけ消せる $ echo '<td>1</td><td>2</td>' | sed 's;<[^<>]*>;;g' 12
Q5
Q4同様な感じです。データをまずはじっくり確認し、完全には解けなくても勘所を押さえるようにしました。
$ unzip -p graph.xlsx xl/worksheets/sheet1.xml | gsed 's/<row /\n&/g' | grep '^<row r' | sed 's;<[^<>]*>;;g' 0A1^3 - 10 *A1^2 - 5-5 A1 + 0.50.5A2^3 - 10 *A2^2 - 5-7.375 A2 + 0.51-14 1.5-24.125 2-37 (略) 9-86 9.5-50.125 A20 + 0.510-5 10.550.125 11116
Q6以降
Q6以降追いつくのは難しかったため、データの確認をする程度にとどめました。
午後の部終了後
勉強会終了後、1時間ほど解説とかをすることにしました。まずデータをじっくり見るためにless
の使い方を再確認しました。
次に少し簡単め?な問題として、閏年を列挙するやり方を解説しました。Gistにメモ的に書いているので載せておきます。
終わりに
Youtubeのライブを見ながら東京のペースにぴったりと合わせていくのは、難易度が高いとなかなかキビシイですね。 以前は必死に追いかけていたのですが、最近は福岡のペースでやってもええかなと思ってやっています。 問題を完全に解くのが目的ではなく、参加者それぞれのペースで何かしら得るものがあればいいのかなと思います。 追いつけなかったぶんについては、勉強会終了後に解答を見て取り組んでみましょう。