日々之迷歩

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

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

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

福岡市内に繰り出すと大勢の人で賑わっていました。これが世に言うクリスマスといふイベントらしいです。そんな中向かっていくのは天神にあるAIP Cafe。そう、今日はシェル芸勉強会です。福岡サテライト会場に合計7人の参加者が集まりました。 問題出題と解説の上田さん、ありがとうございます。参加者の皆様お疲れ様でした。

勉強会の情報

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

b.ueda.tech

午前の部

午前の部は超絶ワンライナーで有名な鳥海さんが担当されました。 今回はシェルのインタラクティブな機能についての話でした。 知っている内容はそこそこありましたが、再認識になりました。また知らないことも色々ありました。 参加者の方には、私の方からも改めて説明させていただきました。 シェル芸勉強会ではシェルそのものの話題が少ない気がするので、なんだか新鮮なイメージでした。

  • 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での参戦でした。 その後下記イントロの話をさせていただきました。液晶ディスプレイの件をまだ引きずっております・・・

speakerdeck.com

それからシェル芸の歴史についても少し紹介いたしました。

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オプションを使う下記の例も参考になりました。展開する先のディレクトリを指定出来るんですね。

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の使い方を再確認しました。

papiro.hatenablog.jp

次に少し簡単め?な問題として、閏年を列挙するやり方を解説しました。Gistにメモ的に書いているので載せておきます。

gist.github.com

終わりに

Youtubeのライブを見ながら東京のペースにぴったりと合わせていくのは、難易度が高いとなかなかキビシイですね。 以前は必死に追いかけていたのですが、最近は福岡のペースでやってもええかなと思ってやっています。 問題を完全に解くのが目的ではなく、参加者それぞれのペースで何かしら得るものがあればいいのかなと思います。 追いつけなかったぶんについては、勉強会終了後に解答を見て取り組んでみましょう。