てんこ製作

Tenco Works

プログラムを作るときに考えていることを実況してみる(前編)

なにかプログラムを作ろうと思い立ったとき、何をどう考えてプログラム完成まで至るのか。実際のてんこの実例を書き残してみたいと思います。プログラム自体の書き方と言うよりは、考え方に寄せた記事になります。

  • プログラムを作るときの頭の中(前編)★今回はこちら
  • プログラムを作るときの頭の中(後編)

ことの始まり

プログラミングしていると、コマンドラインでコマンドを打つ機会がすごく多くなります。しかも似たような、でも微妙に異なるコマンドオプションを何種類も、とかとか。

今回てんこがめんどくさ!と思ったのがsshコマンド。3つのサーバーを使い分けてるんですが、もうどの作業をするのはどのサーバーでなんて名前だっけと毎回迷う始末。

せっかくpython勉強中だし、pythonでうまいことなんとかしよう!と思い立ちました。カスタマイズ可能なテキストメニューを表示してコマンドを実行するようなスクリプトを書けばいいよねたぶん。

実現したいプログラムの挙動

コマンドの名前はcmenuってことにします。

こんな風に動いてくれるといいな。

$ cmenu
*** SSH MENU ***
 1) ssh server1(internal dev)
 2) ssh server2(internal main)
 3) ssh server3(external main)
 q) quit
 select menu[1-3]: 3
execute "ssh server3" ...

メニューを表示して、入力待ちしてくれて、メニューを選んで入力したらコマンドを実行してくれる。みたいなコマンドを作りたい。

できたらメニューも階層化できるようにしたいなあ。

外部から与えるデータ

プログラムに外部から与えなきゃいけないデータは、

  • コマンドの説明文
  • 実行するコマンド

表示順もデータとして外から与えてもいいけど、定義順ってことにしてもいい。

あとは、

  • メニュー表示後のユーザー入力

どのメニューを選ぶかをユーザーに入力してほしい。その結果もデータとして保持する。

処理の流れ

Start
Start
End
End
デフォルトメニュー読み込み
デフォルトメニュー読み込み
読み込んだメニューを表示
読み込んだメニューを表示
メニュー選択
入力待ち
メニュー選択 入力待ち
選択したメニューのコマンドを実行
選択したメニューのコマンドを実行
Viewer does not support full SVG 1.1

処理としてはそんなに複雑ではない。

もう少し細かく下準備

デフォルトメニューのデータファイルはどこに置くか

デフォルトメニューの内容をどこかファイルに保存しておいて、その内容を読むように動作させたい。

では、そのファイルはどこに置こうか?

ちなみに使っているのはLinuxです。Windowsだとレジストリとかになるのかなぁ。

  1. どこに置いてもいいけどコマンド起動時にそのファイルを起動オプションで指定する。
  2. このプログラムが置いてあるところに置く。
  3. どこか固定のパスに置く。
  4. HOMEディレクトリに置いておく。

1.はメニュー起動にタイプ量が増えるので却下。2.だと好きなときにファイルを編集しにくいから却下。3.だと/etc配下? システム設定とか置くようなところだからちょっと恐れ多いので却下。

ってわけで4.のHOMEに(仮)決定。

データファイルの形式をどうするか

動作設定とかパラメータとか、人が書いてプログラムにも読ませるデータを書くのに丁度いいフォーマットがいくつかあります。

  • iniファイル形式
  • json形式
  • xml形式
  • yaml形式

てんこが触ったことがあるのはこのくらい。どれを選んでもよいのでしょうけど、pythonでデータとして読み込んでくれる便利機能がある形式を選びたいところ。

docs.python.org

ググったらpython標準でjson形式をデータとして読み込む機能があるみたいなので、json形式で作ることにします。ファイル名は仮で.cmenu.json。ドットで始まるファイル名はlsコマンドのデフォルトでは表示されないので隠しファイルになります。

今回はここまで

次回は、ここまで用意したものを元にプログラムを書く作業に入ります。