この記事はAIIT(産業技術大学院大学) Advent Calendar 2020、23日目の記事です。
nlコマンド Advent Calendar 2020も開催中です。よろしくおねがいします。
私がnlコマンドに関わることになったきっかけについて書いてみたいと思います。AIITにはとてもお世話になりました。
システムソフトウェア特論
この科目は、システムソフトウェアの代表としてUnix互換OSを取り上げ、情報の処理・蓄積・通信する仕組みとその利用方法を習得する科目です。現在は柴田先生が担当されていますが、私が履修した2014年度は「シェル芸」の提唱者でもある上田先生(現・千葉工大)が担当されていました。内容は比較的初学者向けにOSの仕組みなど幅広い内容を扱いますが、「シェル芸」的な課題もあり脳内のシェルインタープリタがかなり鍛えられたと思います。
講義は基本的に端末を触りながらでしたが、試験はふつうのペーパーテストだったので脳内シェルインタープリタの実装が不十分だと、stderrにxxxx: コマンドが見つかりません
を吐いて戻り値127
で落ちます。
システムプログラミング特論
この科目は、プログラミング言語と開発環境に関する講義と演習からプログラミング技術を修得する科目です。データ構造、アルゴリズム、計算量や、APIを用いた効率的な開発方法について学びます。こちらは小山先生が担当されています。
この科目では、課題の一つにスクラッチでコマンドを実装するというものがあり、評価方法は「どれだけ忠実に実装できたか」です。そして私が履修した2015年度は実装したコマンド(自分で選んだのかもしれません)がnlコマンドでした。
このときは忙しくてあまり課題に時間をかけられなかったのですが、BSD系とGNU coreutilsの実装を比べたりして、課題はなんだかんだ楽しめた記憶があります。このときにnl
の多彩なオプションに驚きました。
シェル芸勉強会
直接AIITとは関係ないですが、先述のAIITの教員だった上田先生が開催している勉強会です。私は2013年12月に開催された第8回クリスマスって何だっけシェル芸なら知ってる勉強会が初参加なので、時系列的にはシステムソフトウェア特論よりシェル芸が先です。しかし、当時はあまりシェル芸もできなかった(けど問題は今よりずっと簡単だった)のを覚えています。
自分のTwitterを振り返ってみると、2014年の8月くらいから勉強会で使用しはじめて、2015年の10月には勉強会のLTでnl
の話をしていたようです。システムプログラミング特論が終わった頃です。しかし一体何が楽しくてそんな話をしていたんだ。
いまや開催回数が50回を超えるシェル芸勉強会ですが、nl
的に大きかった出来事は2016年2月に開催された第21回未経験者大歓迎!誰でも働けるアットホームな職場ですシェル芸勉強会の第7問です。
Q7
GitHubのvol.21/Q7にあるテキストについて、各段落の文字数を数えてください。
私は手元のMacbookでnl
の論理ページを使い以下のような回答を作成しました。
$ cat text | grep -o . | sed 's/ /\\:\\:/g' | nl -nln | cat - <(echo '') | sed -e 's/^1 .*//g' | cut -d' ' -f1 | grep -v '[0-9]' -B1
--
15
--
353
--
103
ところがLinuxだとうまく動かない。「なんで?」となりました。段落内の文字数ではなく、積算された文字数が出力されました。
$ cat text | grep -o . | sed 's/ /\\:\\:/g' | nl -nln | cat - <(echo '') | sed -e 's/^1 .*//g' | cut -d' ' -f1 | grep -v '[0-9]' -B1
--
15
--
368
--
471
後日気になってcoreutilsのソースを調べてみたところ、プログラムのバグだということがわかりました。そしてこの機会に初めてメーリングリストにパッチを投稿しました。初版からの不具合ということで、論理ページがほとんど使われていない機能だということを実感しました。そりゃ誰も使わないよねこんな機能。
これ以降も勉強会で見つけた改良点についてはパッチを投稿するようにしています。次が-iオプションのデクリメント対応で、2020年8月に開催されたjus共催 第49回ボンバイエシェル芸勉強会で参加者から「-iでデクリメントできない」という声があり対応に至りました。しかし、それ以外にnl
の機能修正はほとんどありません。おそらく世界で最もnl
の機能を使いこなす場がシェル芸勉強会ということなんでしょう。すごいぞシェル芸勉強会。
#さいごに
AIIT(東京都立産業技術大学院大学)について記載した科目名などは当時のものです。現在では研究科・コース再編などの影響もあり、変更になっている内容もあると思います。詳しくはAIIT公式の情報をご確認ください。
そしてAIITで「nlコマンド特論」を開講の際はぜひ声をおかけください。