アイキャッチ

構造化プログラミング、難読化…「シェル芸勉強会」の演習の様子をレポート!【法林浩之】

ITニュース

法林浩之@jusがお届け!

UNIXエンジニア温故知新

UNIXが生まれてから半世紀。脈々とソフトウエアの進化を支えてきた技術は、どのようにして今に至るのか? そこから学べるものとは? 日本UNIXユーザ会「jus」の法林浩之さんが、イベントレポートを中心に「UNIXの今」をお届けします!

今回は、2022年3月に行いました第58回シェル芸勉強会の模様をお伝えします。レポートはシェル芸勉強会を主宰する上田隆一さんに書いていただきました。

第58回シェル芸勉強会レポート

2022年3月12日に「第58回花粉シェル芸勉強会」を開催。今回も前回に引き続き、主催の上田から開催レポートをお送りします。

シェル芸勉強会に参加、協力頂いたみなさま、ありがとうございました。

なお、タイトルに「花粉」とありますが、単なる嫌がらせで内容とは関係ありません。

参加者に嫌がらせしてどうする等の質問はご遠慮ください。

午前の部:ジャクソン流構造化プログラミング

午前の部は、鳥海さん(@hid_tori)による講義、「構造化プログラミング入門」の第2回「ジャクソン流構造化プログラミング」でした。

日本UNIXユーザ会

図: 鳥海さんのスライドから。午前の部は視野を広くということで、シェル芸とは全く関係がありません(笑)YouTubeはこちら

講義の内容については、前回と同様、どういう経緯で「構造化プログラミング」という言葉が歪められていったかの話がありました。

前回は、その歪みの最大の犠牲者である「goto」を、状態遷移図を経由して使ってみようという演習になりましたが、今回は、「ジャクソン構造図」を経由してコードを書くという演習になりました。

なぜ「ジャクソン構造図」かというと、鳥海さんによると、ダイクストラ博士が元来主張していた構造化プログラミングをよく体現しているからだそう。

構造化プログラミングにおいてダイクストラ博士は、

* 主張1: 計算の進行とプログラムのテキストの進行を一致させるとよい
* 主張2: 変数とそれを操作する関数をひとまとめにした仮想的な機械の集合としてプログラムを構成するとよい

という二つの主張をしているのですが、ジャクソン構造図は主張2の実践になるそうです。

演習では、まず、「テキストファイル中の単語を数える」という例題をジャクソン構造図に落とし、それをコードにするという例が鳥海さんから示されました。

法林

「テキストファイル中の単語を数える」に対応するジャクソン構造図

さらに説明があったあと、参加者に「浮動小数点数かどうかを判定する」という例題が出されました。

これが、下図のように巨大になるので、参加者のみなさんはかなり苦労をしていました。

法林

図:「浮動小数点数」に対応するジャクソン構造図(鬼)

このあと、コンパイラでよく用いられる先読み技法とジャクソン構造図の関係の話があり、単に文字列に状態を持たせて追いかけるよりもコードが柔軟になるという説明でまとめとなりました。

筆者は浮動小数点数のジャクソン構造図のところで撃沈して朦朧としていたのですが(鳥海さんごめんなさい)、単に構造化プログラミングを、誰にでも分かりやすい上記主張1の文脈で話をしていると、主張2の話が見えなくなってしまうのかなと、話の主旨を解釈しました。

この解釈が正しいかどうかは、冒頭で紹介したYouTubeのリンクや、Togetterでのまとめが残っていますので、ご自身でご確認ください。

若干無責任なレポートになってしまいましたが、午前の部については以上となります。
午後から自分が話す番なのですが、体力をほぼ持っていかれました

スライドはこちら:https://umidori.github.io/shellgei-58th-am/

動画はこちら:https://www.youtube.com/watch?v=oSxFX0q9FxM

午後の部

午後の部も既に定番となってしまったリモート配信で行いました。

YouTubeに配信を編集したものがあります。

4K(2160p)と、無駄に高画質です。また、今回から音圧を上げるなど、音声も大幅にいじっています。

今回の内容から1問

今回は、日付や`date`コマンドに関するもの、難読化、端末の制御、JSONからYAMLへの変換、検索・置換など、雑多に出題しました。

「難読化」の問題を1問掲載します。

* 問題: 数字を直接打ち込むことなく、`date`コマンドに`2022年02月22日 2 22:22:22`と出力させてください。二列目の2は週番号です。

筆者が事前に作った解答を示します。

a=$(($$/$$<<$$/$$));b=$(($$-$$));echo $a$b$a$a$b$a$a$a $a$a:$a$a:$a$a | date -f- "+%x %w %T"
2022年02月22日 2 22:22:22

わけがわからないと思いますが、`a=$((…));`の部分では、変数`a`に`2`が入ります。

なぜかというと、

* `$(( ))`は、bashの計算のための構文
* 「`$$`」には0より大きな整数(わかる人向け: シェルのプロセス番号)が入っている
* `m< なので、`a=$(($$/$$<<$$/$$))`→ `a=$((1<<1))`→`a=$((2))`→`a=2`となります。 また、`b=$(($$-$$))`で、`b`には`0`が入ります。 この変数`a`、`b`を使って`echo`で`20220222 22:22:22`という文字列を作り、`date`で要求されたフォーマット(日本語の年月日、曜日番号、時刻を出力)に変換しています。 このように文字から数字を作る方法は「難読化シェル芸」でよく用いられます。

シェルの細かい文法やコマンドの癖みたいなものが遊んで勉強できるので、おすすめです。本も出ています

最終問題のハプニング

午後の部に関しては、問題を私が出しては参加者が解き、最後に参加者が「疲れた」とツイートするというお約束をもう何度も繰り返しているわけですが、今回はツイートを見返すとそれがありませんでした。

その代わり、

と、PCの方が犠牲になっていたようです

最終問題が、大きなファイルを読み込むものであったのがいけなかったようです。

また、PCが爆発しなかった人は、終わっても疲れを忘れて問題を解き続けていたんだとか。

これに味をしめて(?)、次の第59回は「大きなファイルを扱う」というテーマにしました。本稿が公開される頃には既に開催された後になりますが、次回のレポートもお楽しみにお待ちください。

LT大会

LT(long talk)大会は、たいちょーさん(@xztaityozx_001)の独演会でした。YouTubeに動画が残っています。

今回の題目は、「`surge`コマンド作りました」でした。

`surge`は、たとえば

1 2 3 4 5
6 7 8 9 10
・・・

というファイルの各行を縦のデータに並べてコマンドに入力したいので作ったということでした。

例えばそのような処理を

cat file | while read L; do echo “$L” | fmt -1 | numsum ; done

などと書くと、コードもややこしいし、処理も遅いということで、コマンドにまとめたとのことです。

`surge`はCPUをたくさん使って高速化を図ったそうで、LTでは、実演やベンチマークの結果、苦労話が伺えました。※surge (GitHub)

余談と宣伝

シェル芸勉強会はいつも偶数月に開催しているのですが、今回は上記のように3月になりました。

理由は、本勉強会から出た本「シェル・ワンライナー160本ノック」がITエンジニアリング本大賞のファイナリストとして選ばれ、2月に最終選考があったので、その準備をしていたからでした。

プレゼンはうまくいったのですが、残念ながら大賞はとれませんでした。

ITエンジニアリング本大賞については、大賞を受賞した以外の本については、出版年にかかわらず何度もノミネートできるようです。来年度も投票していただければ幸いです。

また、今回投票いただいた皆様にも、この場をお借りして御礼申し上げます。

参加者ブログ

最後に、参加された方のブログも、リンクだけですが紹介しておきます。

* 第58回シェル芸勉強会に参加しました | たいちょーの雑記
*【自習】「第58回シェル芸勉強会」の解答例 | mikkunの備忘録

プロフィール画像

法林浩之さん(@hourin

大阪大学大学院修士課程修了後、1992年、ソニーに入社。社内ネットワークの管理などを担当。同時に、日本UNIX ユーザ会の中心メンバーとして勉強会・イベントの運営に携わった。ソニー退社後、インターネット総合研究所を経て、2008年に独立。現在は、フリーランスエンジニアとしての活動と並行して、多彩なITイベントの企画・運営も行っている

Twitterをフォローしよう

この記事をシェア

RELATED関連記事

RANKING人気記事ランキング

JOB BOARD編集部オススメ求人特集




サイトマップ