MimixBox(BusyBoxインスパイア)の概要、開発時の気づき、PR募集について【Golang学習】

MimixBoxはGolang学習用アプリとして開始 

Golang製のMimixBoxは、BusyBox(多数のUnixコマンドをシングルバイナリに詰め込んだCLIアプリ)と共通点を持ちつつ、独自の目標を持つCLIアプリとして開発しています。

開発のキッカケは、Golangを学習するためです。前職を退職して、新しい会社では開発経験のないGolangがメイン言語となりました。即戦力となれるよう、私は勉強のためにCLIツールや独自シェルを作り始めましたが、「全部混ぜて開発すればプロジェクト数が増えず、管理が楽では?それなら、BusyBoxを真似するか」という考えに至りました。

ここまで来れば「MimixBox – Mimic BusyBox on Linux(Linux上でBusyBoxを模倣する)」という名称を考えつくのは、一瞬でした。ちなみに、同様のプロジェクトにはtoyboxgoboxがあります(皆、考える事は大体一緒)。

            

MimixBoxはBusyBoxと違う道を目指す

MimixBoxは、Linuxデスクトップ環境でのCLI(Terminal操作)が楽しくなる事を目指します!そのため、「既存Unixコマンドの機能拡張(例:catに対するbat、lsに対するlsd)」や「独自コマンドの組み込み」が大事だと考えています。

 

上記のように考えた理由は「大きめなバイナリサイズ」と「対応コマンド数でBusyBoxに追いつけない事」です。

C言語製のBuxyBoxは、制約の多い組み込み環境でも動作する事から分かるように、バイナリサイズがかなり小さめです。私の環境では、コマンド263個を組み込んだBusyBoxのサイズは約2MBでした。

その一方で、コマンドを数個しか組み込んでいないMimixBoxは、サイズが約4MBありました(現在はコマンド42個で約5.6MB)。デバッグシンボルなどの不要な情報をstripしてもBusyBoxの2倍を超えるサイズなので、MimixBoxは組み込み環境向けとするのは無謀でした。

 

また、BusyBoxはコマンド数が400個以上あり、ドマイナーOSSのMimixBoxが同路線(量を増やす事)を真似しても勝ち目がありません。MimixBoxの出自はBusyBoxの模倣品ですが、BusyBoxを100%模倣しても面白くないので「じゃあ、コマンド単位の質を上げるか」と発想しました。

 

MimixBoxのロードマップ

MimixBoxはGolang学習用のOSSという側面もあるので、全て独自コマンドで構成するような事はしていません。まずは、一般的なUnixコマンドを量産しつつ、合間に独自コマンドを開発するようなスタイルで進めています。

〜2022年12月:MimixBoxロードマップ
  • Step1. 100件以上のUnixコマンドを実装(機能の増加、〜Version 0.XX.xx)
  • Step2. オプションおよびテストを拡充(品質向上、〜Version 1.XX.xx)
  • Step3. コマンドを近代的な仕様に変更(独自性の追加、〜Version 2.XX.xx)

           

MimixBoxの独自オプション

MimixBoxは、BusyBoxとはオプションが異なります。下表にオプション一覧を示します。

(◯はMimixBox独自、△はBusyBoxから仕様変更、×はBusyBoxと同じ挙動)

オプション 独自(仕様変更) 仕様
-i, –install MimixBox組み込みコマンドのシンボリックリンクを指定ディレクトリに作成する。ただし、システムに同名コマンドが存在する場合は、リンク作成しない。
-f, –full-install MimixBox組み込みコマンドのシンボリックリンクを指定ディレクトリに作成する
-h, –help × ヘルプメッセージを表示する
-l, –list MimixBox組み込みコマンド名称と説明文を表示する
-r, –remove MimixBox組み込みコマンドのシンボリックリンクを削除する
-v, –version × バージョン情報を表示する

オプションに独自性を出した理由は、「MimixBox開発中にシステムをブッ壊したから」です。引数処理を間違えた結果、MimixBoxの提供するcatコマンドが動きませんでした。運悪くGUIライブラリがcatコマンドを使っていたので、GUI起動が必ず失敗するようになりました。

この問題の対策として、「–installオプションが安全インストール(システムに存在しないコマンドのみシンボリックリンク作成)」「–full-installオプションがBusyBoxと同仕様」としました。さらに、レスキューモードでのシステム復旧が簡便になるように、–removeオプションでシンボリックリンクを一掃できるようにしました。

現在は、Docker内でMimixBoxをテスト可能な状態にしたので、より安全に遊べます。

                          

MimixBox開発中の気づき(感想)

気づき(感想)は、3つあります。その内容は、「プロジェクトの感触が良い事」「Golangと親友に慣れない事」「ユニットテストの重要性」についてです。

 

MimixBoxプロジェクト(2021年11月28日現在での規模は約5000[LOC])は、開発開始して1ヶ月弱。Golangの文法やAPIを着実に学べており、個人的には良いプロジェクトと感じています。長期間付き合って行けそうなプロジェクトである点も好ましく、「便利なOSSになると良いなー」と考えながら実装してます。

Golangと親友になれない件は、身も蓋もない話ですが、私はGolangがあまり好きではなく。個人的な印象では「Golangは便利なC言語」止まりであり、どちらかと言えば私はクラス指向の強いJavaやRubyの方が好み。C言語やGolangを書いている時はデータ中心に設計できなくなる傾向(癖)があり、処理をシーケンシャルに記述しがち。まだ慣れていないという事でしょうか。

       

ユニットテストの重要性については、言うまでもないでしょう。今回は、Version1.0.0(= コマンドを100件程度作成した状態)でユニットテストを量産する予定でした。しかし、MimixBox組み込みコマンド全体に影響がある修正が必要になった時、「テストを先に作れば良かった……」と後悔しました。

全コマンドに影響がある修正は、何度も発生しました。例えば、「パイプ(”|”)対応」「リダイレクト(”>”や”>>”)対応」「引数で指定された環境変数の展開」あたりは、初期実装時には未対応でした。そのため、途中で機能追加しました。が、テストが無かったのでデグレしているのかが即座に分からず、手間が多くかかりました。

同じ轍を踏まないように、Version 1.0.0に移行する前にユニットテストを作り始めようかな、と考えている次第です。

                       

Pull Requestを歓迎します

MimixBoxは、2021年11月28日現在で42個のコマンドをサポートしています(一部、基本機能すら未完成コマンドがありますが……)。より多くのコマンドをサポートしたいので、「未サポートコマンド(独自コマンド含む)の追加」「オプション追加」「バグ修正」など、PRいただけると大変嬉しいです。

以下、MimixBoxに組み込んでいるコマンド(サポートコマンド)リストです。

コントリビュートに関する資料(コマンド追加方法含む)は、コチラに記載しています。基本的なルールは、「GPLv2ライセンスのコードは含めないでください」と「テストコードなくてもOK」ぐらいしかありません。

また、MimixBoxの開発状況を伝えるためのTwitterアカウントがあります(ちょっと作るの早いと思いましたが……)。日本語と英語の両方で情報発信して行く予定ですので、ご興味があればフォローお願いいたします!

             

GitHub Sponsorsでスポンサーを募集中

最近話題のGitHub Sponsorsに対応しています!

金銭的な支援をいただけるのは単純に嬉しいですし、誰かにサポートしていただいている事実はそれだけでモチベーションが上がります。以下のボタンを押してもスポンサーページに飛ぶだけなので、安心してクリックしてみてください。

スポンサーの方へのお礼(金額によって対応可否が異なります)
  • MimixBoxのコントリビュータリスト(支援者一覧)に名前を記載
  • Twitter上でのお礼(名前およびSNSアカウントを併記)
  • 優先的に開発するコマンドの決定権(コマンド1個分かつ規模200〜500[LOC]程度)

           

 おまけ:2022年に作成したGolang製コマンド一覧

【Golang】2022年に開発した自作CLIコマンド/ライブラリに対する所感と宣伝【OSS】

おすすめ

2件のフィードバック

  1. 2021年12月17日

    […] 私はPythonよりシェルが好きです(≒使用頻度が高い)。BusyBoxもどきのOSS(未完成)を作るぐらいには、シェル(コマンド)に関心があります。ShellCheck(Haskell製のシェルスクリプト静的解析ツール)やShellSpec(シェル製のシェルスクリプトBDDスタイルテスティングフレームワーク)を活用して、可能な限りシェルでスクリプトを書けないかな、と考えたりもしています。 […]

  2. 2022年2月5日

    […] MimixBox(BusyBoxインスパイア)の概要、開発時の気づき、PR募集について【Go… […]