日々之迷歩

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

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

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

福岡市内に繰り出すと大勢の人で賑わっていた。これが世に言うクリスマスといふイベントらしい。そんな中向かっていくのは天神にあるAIP Cafe。そう、今日はシェル芸勉強会。福岡サテライト会場に、私も含め合計7人の有志が集った。しかし今回は内容的に不穏な雰囲気が漂う・・・

イベント案内ページ

本家東京会場

usptomo.doorkeeper.jp

大阪サテライト

atnd.org

福岡サテライト

atnd.org

Togetterによるまとめ

togetter.com

午前の部

午前の部は超絶ワンライナーで有名な鳥海さんが担当。今回はシェルのインタラクティブな機能についての話だった。だいたい知ってはいたが再確認になった。参加者の方には、私の方からも改めて説明した。シェル芸勉強会ではシェルそのものの話題は少ないので、新鮮な感じだった。

  • 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

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

シェル芸の歴史 – 上田ブログ

昼食

参加者みんなで近くの一風堂にラーメンでも〜と出かけたら、トンデモナイ行列。みんなクリスマスにそんなにラーメン食ってどうするん??長時間待ちたくなかったので別のラーメン店に。以前食べたことがあるお店だったが久々に美味しかった。

午後の部

さあいよいよ本番開始。今回はMicrosoft Officeなファイルを扱う内容だったが、正直東京のペースに合わせながらやるのは無理があったため、途中から福岡独自のマイペースで進めることにした。

問題と解答は下記を参照して欲しい。

【問題と解答】第26回シェル芸勉強会及びエクシェル芸勉強会 – 上田ブログ

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

後は参加者の方がちょっと発表したりする機運をそろそろ出していきたいなあと思ったり。そのためにはペース配分とかをどうするか?毎回試行錯誤の連続である。