はじめに
Mac標準のファイアーウォール機能は、アプリケーション単位での通信許可・不許可の設定しかできなくて、ポート単位での設定ができないんですよね。
通常はいいのですが、Githubなどから持ってきたWebアプリケーションをTCP 3000とかで動かして、LAN内で公開しようとするとMac標準のファイアーウォールがブロックしてしまう。
例えば、Ollama-webuiをLAN内の他の端末からでもアクセスできるようにするような時に。
ファイアーウォールは有効化したい、でもアプリケーション単位ではなくて、LinuxのiptablesみたいにポートやIPレンジでパケットフィルタがしたい。
10年くらい前にはpfの設定をGUIでできるフリーウェアがありましたが、今は同等のものはないみたい。
pfctlを覚えればいいんだけれど、Gemini CLIをつかってpfを設定するためのTUIツールを作ってみることにしました。
ちなみに、会社のMacには指定のセキュリティソフトが入っているので勝手にパケットフィルタ等を設定することはできません。
なので業務外で作成し、動作チェックまで全て個人のものを利用しています。
やったこと
後から考えると最初からGemini CLIで作ればよかったんですが、最初Claudeにプロンプトを投げてプログラムの雛形を作り、それをGemini CLIに持ってきました。
その後、Gemini CLIを使って設定の編集、保存、インポート、既存の設定の順番入れ替え機能などをバイブコーディングで追加していきました。
ちなみにGemini CLIに日本語はインライン入力できなそうなので、英語で指示出し。
あと、自分の使い方ではどうしても1日の利用制限に引っかかってしまったのですが、業務とのバランスを取る上で良かったかもしれません。
17時頃に制限がリセットされるので、早めに仕事を終わらせて、個人プロジェクトに取り掛かるモチベーションにもなりますね。
Gemini CLIには癖がある?
設定書き出しやインポートは2日目くらいに出来上がったのですが、その後既存設定の順番入れ替え機能は少し時間がかかりました。
なかなかうまく実装されず、何度か過去のバージョンに戻してバイブコーディングし直したり。
またGemini CLIで書かれたコードが時々起動しないことがありました。
理由は簡単で、print文の一番最後になぜか不要な'}'が入っていて起動時にエラーになっていたため。
こういう時はエディタで開いて手作業で'}'を削除。
あと、Gemini CLIはprint()には必ず'f””'をつけるようで、Zedエディタで'}'を削除した時に、「print(f"my_string")となっているけれど、置換すべきものがない」みたいな警告が複数箇所で表示されました。
Zedエディタに言われた通り修正し、併せて提案された関数戻り値についての修正をしたところ、パケットフィルター設定画面での文字入力時にフリーズするというパフォーマンスの問題が発生。
さらに、設定確定前の確認ダイアログまでは表示できているのに、Enterを入力しても何も起きないとか、場合によってはクラッシュしてしまうことも多々あり、また過去のバージョンに戻してGemini CLIに書き直しを依頼。
Pythonやプログラミングのことが何もわからないという人がバイブコーディングだけでアプリケーションを作るというのはまだ今の時点では難しいかもしれませんね。
とは言っても、具体的にこうしたいということを言語化できれば、そのように動くプログラムを作ってもらえるというのはびっくり。
コーディング自体は得意ではなくても、一般的なコンピューターの仕様とかソフトウェアの構造がイメージできていれば、Gemini GLIが動くものを作ってくれます。
そして、試行錯誤
ここまでで4,5日くらい。
まだテンポ良く進めてたのですが、その後のポートフォーワード機能の追加がちょっとたいへんでした。
まずはpfやanchorファイルの書き方や仕様について勉強しようにもネット上に情報があまりなく、ClaudeやChatGPTに聞いたりしてある程度把握。
パケットフィルターのルールとポートフォーワドのルールは一つのファイルに書いてOK、ただしポートフォーワードのルールが最初に来ないといけないことがわかりました。
その上で、Gemini CLIに機能追加の依頼をして、メインメニューへの追加はできるものの、機能がなかなか実装できない。
そして時点で1500行以上あり、プログラム全体をChatGPTやClaude(いずれも無料版)に読み込ませて、書き換えてもらうことはトークン数の制約でできませんでした。
そこで、ChatGPTやClaudeに関数単位で貼り付けて改善を依頼。
例えば既存のパケットフィルターに関連するところからコピーしたコードを、ポートフォーワード設定の方に手作業でコピペなどをしました。
コードを書くところはGemini CLIに一元化
色々試行錯誤する中で、関数だけClaudeに読み込ませて書き換えてもらったコードを上書きしたら、上手く動いたもののUIの統一感がない。
しかも、Claudeが生成したコードのUIを他のUIと同じように統一するようGemini CLIに依頼したら、Claudeが書いたコードをバッサリ削除。
Gemini CLIさんには自分なりの書き方やこだわりがあって、別のAIが書いたコードは気に食わないんですね。
なので、コード変更自体はGemini CLIにお願いするというのを徹底した方が良さそうです。
1週間ちょっとで何とか動くように
目標としていた開発1週間目の週末、ある程度動くようになってきたので、READMEもGemini CLIに書いてもらいました。
そしてついにGithubに初のコミット!
検証不足のところや、既知の問題などまだあります。
でも、Gemini CLIの力を借りて1週間ちょっとでここまでのものができてしまうことに感激。
自分が欲しいアプリケーションをバイブコーディングで作る時代がすぐそこまで来てるのかも。