連載プロデル入門の18話目です。今回はプロデルでコンソールアプリを作る方法を紹介します。
コンソールアプリとは
コンソールアプリとは、黒い画面に文字だけで表現するCLI(Command Line Interface)上のアプリです。コマンドラインというテキストでプログラムへの指示します。また処理結果の表示は、すべてテキスト文字だけで表示されます。Windows上での代表的なCUIは、Windowsターミナル(コマンドプロンプトやPowerShellプロンプト)です。
バッチ処理や計算処理などウィンドウ部品を必要としないプログラムを作るときには、コンソールアプリとして作ると、自動化が容易になるなど便利です。
プロデルプログラムをコンソールで実行する方法
プロデルプログラムをコンソールで実行する方法には、大きく2つあります。
- ランタイム環境で実行する(pconsole.exe/プロデルデザイナ)
- コンソールアプリとしてコンパイル済みの実行可能ファイルを作成して実行
ランタイム環境では、プロデルのプログラムを指定してそのまますぐに実行できます。バッチファイルやスクリプトの感覚でプログラムを修正したり実行したりできます。
一方、コンパイル済み実行可能ファイルは、作成したプログラムを単体の実行可能ファイルとして作成したものです。プロデルをインストールしていない他のPCでも実行できます。プロデルデザイナで実行可能ファイルを作成するときにはファイルの種類に「コンソールアプリ(ランタイム環境)」もしくは「コンパイル済みコンソールアプリ」を選択して作成します。
ランタイム環境のコンソール版プロデルで実行する
ランタイム環境のコンソール版プロデル本体は、pconsole.exeというプログラム名です。プロデルをインストールした時には、Cドライブのユーザデータフォルダの中にあるProduireフォルダにコピーされています。コマンドプロンプトやPowerShellでランタイム環境のプロデルプログラムを実行するには、pconsole.exeを起動します。
まずスタートからコマンドプロンプト/PowerShellを起動して、次のようにpconsoleに続けてプロデルファイルのパスを指定します。
cd %HOMEPATH%\AppData\Local\Programs\Produire
pconsole helloworld.rdr
なお、次のように/eオプションを付与してその後にプログラム文を指定すると、その式が評価されて表示されます。
cd %HOMEPATH%\AppData\Local\Programs\Produire
pconsole /e 時刻を出力する
プロデルデザイナ向けオプション「※コンソール」
プロデルデザイナを使ってコンソールアプリを作る場合には、次のようにコンソールプリプロセッサを指定すると、コンソールアプリとして実行されます。
※コンソール
このプリプロセッサを指定してプロテルデザイナから実行すると、コンソールアプリでも実行中のプログラム中の「報告する」手順での報告結果をプロデルデザイナ上の「対話コンソール」で確認できます。また実行時エラーが発生した行数もプロデルデザイナでハイライトされすぐに確認できます。
ターミナルに文字列を表示する
コンソールに関係する操作は、「コンソール」種類を使います。コンソールに文字列を出力するには「出力する」手順を使います。
※コンソール
「こんにちは」を出力する
入力を受け付ける
コンソールで実行中にユーザから文字列の入力を受け付けるには「受け取る」手順を使います。プログラムの実行中に、必要な情報を入力したり操作を選んだりできます。
※コンソール
コンソールへ「名前を入力してください」を表示して改行する
コンソールから受け取って名前とする
名前をコンソールへ表示する
※コンソール
繰り返す
コンソールへ「処理を続けますか?(Y/N)」を表示して改行する
コンソールから受け取って答えとする
もし答えが「Y」または答えが「N」なら
「答えは[答え]です。」をコンソールへ表示する
繰り返しから抜け出す
もし終わり
繰り返し終わり
ファイルから内容を受け取る
コマンドプロンプトのリダイレクトを使って、プログラムが受け取る内容をテキストファイルで指定することもできます。複数のデータを一括処理する場合などに便利です。「受け取る」手順では、テキストファイルの内容を一行ずつ読み取ります。
コンソールから受け取ってAとする
コンソールから受け取ってBCとする
BCを「 」で区切ってTとする
「[A] [T(1)] [T(2)]」を出力する
input.txtの内容
100
20 30
コマンドライン
コンパイラ済みの実行可能ファイル(redirect.exe)を作成して次のようなコマンドラインを指定します。
redirect.exe < input.txt
もしくはランタイム環境では
pconsole redirect.rdr < input.txt
パラメータを指定できるようにする
コンソールアプリでは、コマンドプロンプトのコマンドラインでオプションや対象ファイル名を引数(パラメータ)として指定させることができます。
プロデルでは「コマンドライン引数」設定項目(または「起動時設定」)にコマンドラインで指定した引数が文字列の配列として格納されています。
コマンドラインでパラメータを指定する場合、必要なパラメータをスペース区切りで指定します。指定されたパラメータは「プログラムのコマンドライン引数」でスペース区切りの文字列配列として格納されます。
次のプログラムでは、コマンドラインで第一引数に指定したファイルの内容を出力しています。
もしプログラムのコマンドライン引数が無なら
「ファイルが指定されていません」をコンソールへ出力する
終了する
もし終わり
内容は、プログラムのコマンドライン引数(1)から読み込んだもの
内容をコンソールへ出力する
プロデルデザイナで「実行可能ファイルの作成」を使って、コンソールアプリを作った場合には、その実行可能ファイル名に続いて引数を指定します。
myapp.exe text.txt
なお、コマンドプロンプトから引数を指定して実行する時は、次のように、pconsole プロデルファイル 引数の順に指定します。
pconsole.exe myapp.rdr text.txt
また、ファイル名などのパスや、指定する内容に半角スペースが含まれる場合には、そのパラメータ値全体をダブルクォートで囲います。
pconsole.exe myapp.rdr "データ ファイル.txt"
文字の色を変える
コンソールに出力する文字の色を指定するには、「コンソール」種類の「文字色」設定項目を使います。また「背景色」設定項目で出力文字列部分の背景色を指定できます。色は、コンソールに文字を出力する前に、指定しておく必要があります。
「文字色」「背景色」に指定できる色は、次の16色です。そのほかの色は指定できません。
Black | 黒 |
Blue | 青 |
Cyan | シアン (青緑) |
DarkBlue | 濃い青 |
DarkCyan | 濃いシアン (濃い青緑) |
DarkGray | 濃い灰色 |
DarkGreen | 濃い緑 |
DarkMagenta | 濃いマゼンタ (濃い赤紫) |
DarkRed | 濃い赤 |
DarkYellow | 濃い黄色 (黄土色) |
Gray | 灰色 |
Green | 緑 |
Magenta | マゼンタ (赤紫) |
Red | 赤 |
White | 白 |
Yellow | 黄 |
※コンソール
コンソールの文字色をDarkGreenに変える
「なし」を出力する
コンソールの文字色をDarkRedに変える
「りんご」を出力する
コンソールの文字色をDarkYellowに変える
「みかん」を出力する
コンソールの文字色をDarkBlueに変える
「ぶどう」を出力する
圧縮解凍CUIツールを作る
コンソールアプリの作例として、CUIの圧縮解凍ツールを作ってみます。コマンドライン引数に、圧縮ファイルや対象のパスを指定して、ファイルの圧縮や解凍の操作をするツールを作ります。圧縮もしくは解凍の操作はオプションで切り替えれるようにします。
まずは、コマンドライン引数に圧縮する対象パスと圧縮後のzipファイルの2つを指定することで、ファイルを圧縮できるコンソールアプリを作ってみます。
※コンソール
開始引数は、プログラムのコマンドライン引数
もし開始引数が無または開始引数の個数が2未満なら
「パラメータが指定されていません」をコンソールへ出力する
終了する
もし終わり
対象パスは、開始引数(1)
出力ファイルは、開始引数(2)
対象パスを出力ファイルへ圧縮する
このプログラムからコンソールアプリの実行可能ファイル(圧縮.exe)を作ります。そしてコマンドプロンプトで次のように指定して実行すると「フォルダ」のファイルを「フォルダ.zip」へ圧縮できます。
圧縮.exe フォルダ フォルダ.zip
次に、オプションによって圧縮と解凍を切り替えられるようにします。
コマンドラインでのオプションは、通常、種類やその値をスペース区切りで指定していきます。また一般に複数のオプションを同時に指定できたり、オプションを指定する順番が決まっていない場合があります。プロデルでコンソールアプリを作る場合は、オプションの内容を自由に決めることができます。
プロデルの「プログラムのコマンドライン引数」には、コマンドラインをスペースで区切った配列が格納されていますので、一つずつ要素を調べてオプション内容を取得できます。
次のプログラムでは、2つのパラメータ(入力対象と出力先)を指定して、/cオプションでは圧縮、/eオプションでは解凍する処理を実行します。一般にWindowsのCUIではオプションスイッチに「/」を付け、Linux系では「-」を付けるます。オプションが正しく指定されていない場合は、エラーメッセージを表示するようにします。
※コンソール
開始引数は、プログラムのコマンドライン引数
開始引数が無または開始引数の個数が2未満なら
「パラメータが指定されていません」をコンソールへ出力する
終了する
もし終わり
//オプションの解析
番号は、1
モード名は、無
繰り返す
もし番号が開始引数の個数より大きいなら繰り返しから抜け出す
もし開始引数(番号)が「/」で始まるまたは開始引数(番号)が「-」で始まるなら
オプション名は、開始引数(番号)の2文字目以降
もしオプション名が「c」なら
モード名は、「圧縮」
他でもしオプション名が「e」なら
モード名は、「解凍」
そうでなければ
「[オプション名]というオプションはありません。」とコンソールへ出力する
もし終わり
そうでなければ
繰り返しから抜け出す
もし終わり
番号を増やす
繰り返し終わり
対象パスは、開始引数(番号)
番号を増やす
出力パスは、開始引数(番号)
もしモード名が「圧縮」なら
対象パスを出力パスへ圧縮する
他でもしモード名が「解凍」なら
もし対象パスというファイルが存在すれば
対象パスを出力パスへ解凍する
そうでなければ
「[対象パス]が見つかりません。」とコンソールへ出力する
もし終わり
そうでなければ
「/e,/cオプションを指定してください。」とコンソールへ出力する
もし終わり
ツールを利用するには、プログラムを実行可能ファイル(圧縮解凍.exe)として作成します。
圧縮する場合は、次のようなコマンドラインを指定します。/cオプションで、「フォルダ」のファイルを「フォルダ.zip」へ圧縮します。
圧縮解凍.exe /c フォルダ フォルダ.zip
解凍する場合には、次のようなコマンドラインを指定します。/eオプションで、フォルダ.zipの内容を「展開先フォルダ」へ解凍して展開します。
圧縮解凍.exe /e フォルダ.zip 展開先フォルダ
画像をアスキーアートに変換する
最後に、画像からアスキーアートを生成するプログラムを作ってみます。コンソールへ画像の代わりに画像の色の濃淡を画数の大小で文字に置き換えて出力します。
このプログラムでは、画像ファイルを読み込み、30行×40列の文字列として表現します。画像を「配列化」することで、特定のピクセルの色番号を調べることができます。色番号からその色をグレースケールにして明るさを0~255の範囲で求めます。
一方で、ここで色の明暗を表現する文字列「 一二八三七九千六万四五百億」を画数の少ない順に並べて、0~255の範囲を14分割してそれぞれに対応する文字に置き換えて出力します。
※コンソール
もしプログラムのコマンドライン引数が無なら
「ファイルが指定されていません」をコンソールへ出力する
終了する
もし終わり
文字一覧は、「 一二八三七九千六万四五百億」
元画像という画像(プログラムのコマンドライン引数(1))を作る
元画像を{30,40}へリサイズしてリサイズ画像とする
リサイズ画像を配列化してAとする
Hを1から(Aの個数)まで増やしながら繰り返す
B=A(H)
Wを1から(Bの個数)まで増やしながら繰り返す
C=B(W)
D=(Cの赤+Cの青+Cの緑)/3/(255/(文字一覧の文字数))
文字一覧の(Dの整数+1)文字目を出力する
繰り返し終わり
改行を出力する
繰り返し終わり
まとめ
プロデルでCUIアプリを作る方法を解説しました。CUIアプリは、入力内容や出力結果をテキスト形式で扱えるので、他のツールやプログラムと組み合わせて面倒な操作を簡単・便利にするアプリが作れます。また必要に応じてオプションを切り替えて、GUIアプリとは違った感覚で操作するツールを作ることもできます。ぜひコンソールアプリを作ってプロデルをもっと活用しましょう。
※当ブログの記事の著作権はゆうとにあります。プロデルに関係が無い目的で、文章や図表,プログラムを複製, 改変, 移植して掲載することを堅く禁止します