日々之迷歩

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

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

「第30回シェル芸勉強会:福岡サテライト」レポート

ヘコたれそうな、というよりヘコたれる超忙しさでしたが、なんとかシェル芸勉強会の福岡サテライトを開催することが出来ました。会場は久しぶりにAIP Cafeでした。 問題出題と解説の上田さん、ありがとうございます。参加者の皆様もお疲れ様でした。

今日は結構涼しくなりましたが、午前中は雨が降って湿度が高めで会場到着時には結構汗だくでした。 今回福岡サテライトでは総勢6人の参加者が集いました。初参加の方もいらっしゃいました。

勉強会の情報

勉強会主催者上田さんが公開されているリンク集をご覧ください。

b.ueda.tech

午前の部

「eval系超絶ワンライナー教祖」の鳥海さんによるPerl入門第二回でした。今回の話題は、本題?であるPerlの正規表現でした。 私は大学の学部生時代まではコンピュータを全く触ったことがなかったのですが、理学系の大学院生になってからはデータを扱うことが多くなり、データ処理のためにPerlやシェルスクリプトをやり始めた記憶があリます。

昼食

お昼は参加者みんなで会場近くのラーメン屋さん「一風堂」に行きました。知らなかったのだがここが本店らしいです。美味かったですね。

http://www.ippudo.com/store/daimyo/

Webシステムでの決済に関する話題が上がったりしました。決済やったことないですね。

午後の部

今回はイントロのスライドとか準備出来てなかったので、とりあえず一息つきました。 せっかくなので持ってきたSoftware Design 9月号の宣伝をしました。

今回も福岡サテライトなりのペースで進めていきました。自分なりに考えて解説した内容を下記に記載いたします。

Q1

Markdown形式で書かれたテキストファイルが複数のディレクトリ内にばらまかれていて、最初に出現するKeywordsの行のみを収集する問題でした。 簡単なようでうまくさばくことが出来きませんでした。 出題者上田さんの解答解説を聞いて、grepコマンドの-mオプションについて知見を得ました。

Q2

これはsedの置換に慣れるための練習問題でした。 後方参照や正規表現の最長一致についてなど解説しながら考えましたがギブアップでした。

正規表現の最長一致についてはgrep -oを使ってこんな感じで解説しました。

"でクォーティングされた範囲を指定する場合について。

# "が複数ある場合には最長の長さでマッチする。
$ echo '<li><a href="/files/https://blog.ueda.tech/">クソブログ</a><a href="/files/huge.html">ふげ</a></li>' | grep -o '".*"'
"/files/https://blog.ueda.tech/">クソブログ</a><a href="/files/huge.html"

# "[^"][^"]*"という具合に指定すれば意図した範囲にマッチする。
$ echo '<li><a href="/files/https://blog.ueda.tech/">クソブログ</a><a href="/files/huge.html">ふげ</a></li>' | grep -o '"[^"][^"]*"'
"/files/https://blog.ueda.tech/"
"/files/huge.html"

Q3

力技でゴリゴリやる方法を考えていたのですが、pandocの使い方を復習する問題でした。pandoc便利ですね。

Q4

GitHubにリポジトリを作るhubコマンドってのがあるのを知りました。 福岡サテライトではncコマンド(netcat)について少し解説をしました。

Q5

色々やったがギブアップでした。福岡ではbcコマンドについて解説しました。下記は1行目と2号目を掛け算する例です。

$ echo -e '5\n8' | xargs | tr ' ' '*' | bc
40

Q6

フィボナッチ数列について色々調べてみました。 自然界に多く存在し、花の花弁数やヒマワリの種の数、その他黄金比率など色々と役に立つらしいですスゴイ。 そんなことを調ベているうちに、問題を考える時間が無くなる始末です。

Q7

ようやくまともに解けた唯一の問題でした。 bashのループを使いましたが、出題者上田さんからループを使わない解答例の解説もありました。

$ seq -w 00 99 | while read n; do grep -q $n nums || echo $n; done
31
33
42
43
56
61
64
65

Q8

アルファベットをasciiコードに変換して、引き算して数を数える方法を考えました。 結局何行目が一番多いか?という解答しか思いつきませんでした。 MacやFreeBSDの場合は、3つ目のコマンドはGNU sedのgsedを使いました。

$ cat alphabet | xxd -p -u | sed 's/2D/-/g;s/0A/\n/g' | ( echo ibase=16; cat ) | bc | tr -d '-' | awk '{print NR,$i}' | sort -k2,2nr | awk 'NR==1{print $1}'
2

午後の部終了後

今回はあまりの忙しさゆえに、イントロスライドやLTなど準備が出来ませんでした。 福岡サテライトでは基本的に私の解説や話を中心に進めていっているのですが、 参加者の方が何か話題を提供出来るような場も良いなあと思ったりしています。

大阪サテライトを主催されているくんすとさんのこの意見が、実にマトを得ていると思った。ハードルを低くしていきたい。