はじめに
lolcatとは、Rubyで作られたツールで、ファイルや、標準入力からインプットされたデータをカラフルに出力するツールである。
lolcat(ロルキャット)は海外のインターネットミームで、ネコの画像にユーモラスで風変わりなキャプションを、正しくない英語で付けたものだそうである。
なおChatGPTでも念のため確認したがlolcatコマンドにLGBTの社会的文脈はありません。
できたもの
標準ライブラリしか使っていないので、Windowsでも動くのである。
ここでは help メッセージを表示しているけど、普通の使い方としては、
ls | lolcat
みたいな感じで標準入力からデータを渡す感じだと思う。
気づき
- Rubyのeach_lineはデフォルトでchompしないがCrystalはする(罠)
これについては、下記のフォーラムを参照してほしい。
- ARGF.each_line はMacではOKだがUbuntuでは何らかのバッファーがあり、リアルタイムで標準入力を読まない(RubyでもCrystalでも同様)。なのでRubyではIO#sysread、Crystalでは IO#read(byte_chunk) 使うなど小技が必要になる。
ちょっと疑問が残っているところ
コマンドラインオプションを構造体にしているけれども、これが本当にいいかどうかはちょっと考えどころ。構造体はスタックに確保されるため効率はいいのだけれども、メソッドに渡されるたびにコピーされてしまう。これは、getter を使っている場合でも同じだったはず。そしてLolcatは、このコマンドラインオプションをメソッドに渡すコードがたくさんある。classにして参照するか、@で直接参照した方がいいのかも。
このツールはコマンドラインツールを作成するためのサンプルの一つとして作成したけれども、そのあたりは今後の課題です。