エスケープシーケンスで太字や色付き文字

前々回の記事に載せた BMIの算出と肥満度 の Pythonプログラムを、f文字列を使うなどして、読みやすくしてみました。

#! python

# f文字列中で使用するエスケープシーケンスを3文字で命名
CLS = "\033[2J"   # 画面消去(CLear Screen)
TLT = "\033[0;0H" # カーソルを左上(0,0)へ(To Left Top)
BLD = "\033[1m"   # 太字にする(BoLD)
RED = "\033[31m"  # 文字を赤くする(RED)
RST = "\033[0m"   # 全ての属性をリセット(ReSeT)

# 定数を定義
RANK = [18.5, 25.0, 30.0, 35.0, 40.0, 1000.0]
FAT = ["低体重", "普通体重", "肥満度1", "肥満度2", "肥満度3", "肥満度4"]
NRANK = 6
ERRMESS = f"{BLD}{RED}入力に誤りがあります{RST}"

# 浮動小数点に変換可能な文字列か判定
def is_float(s):
    try:
        float(s)
        return True
    except ValueError:
        return False

# 肥満度判定
def decide(bmi):
    decision = ERRMESS
    for r in range(NRANK):
        if bmi < RANK[r]:
            decision = FAT[r]
            break
    return decision


# 事実上のメイン
def kernel():
    print(f"{CLS}{TLT}")
    print(" ")
    print(" ")
    
    print(f"{BLD}体重と身長からBMIを算出し肥満度を判定します{RST}")
    
    print(" ")
    print("体重を入れてください")
    wei = input(f"            (kg) > {BLD}")
    print(f"{RST}")
    print("身長を入れてください")
    hei = input(f"            (cm) > {BLD}")
    print(f"{RST}")
    
    if is_float(wei) and is_float(hei):
        w = float(wei)
        h = float(hei) / 100.0
        if (w > 0) and (h > 0):
            bmi = w / h**2
            print(f"BMIは {BLD}" + str(round(bmi, 2)))
            print(f"{RST}")
            print(f"判定は {BLD}" + decide(bmi))
            print(f"{RST}")
        else:
            print(ERRMESS)
    else:
         print(ERRMESS)


# main
Conti = "y"
while Conti in ["y", "Y", "y", "Y"]:
    kernel()
    print(" ")
    print(" ")
    print(" y を入れると計算を続けます。y 以外だと終了。")
    Conti = input(" y ?  > ")

※ このプログラムはフリーソフトとしますので、コピーしてご自由にお使いください。 下記のシステムで動作確認済みです。

iPad の a-Shellで作成したプログラムのショートカット作成

iPad 上の、App Store の承認を受けた、グラフィカル・ユーザー・インターフェイスGUI)のアプリは、ホーム画面上のアイコンをタップするだけで起動でき、終わらせるのも簡単です。しかし、アプリを自作してホーム画面に登録するのは、なかなかハードルが高いように思います。

a-Shell は、文字ベースなユーザー・インタフェイス(CUI)のプログラムが自由に作れて実行できますが、原則として、まずは a-Shell アプリを立ち上げてから、プログラムを実行して、終わったら、exit コマンドで a-Shell アプリを終了させる、という手間がかかります。

しかし、「ショートカット」アプリの助けを借りれば、アイコンの登録と、プログラムの起動と終了の操作のしやすさをアプリ並みにすることができるので、きっとiPadでプログラムを自作することが楽しくなると思います。

そのサンプルとして、前回の投稿で使った 「BMI と肥満度」のPythonプログラムを、「ショートカット」アプリを使ってホーム画面上に登録し、a-Shell を自分で立ち上げることなく、ホーム画面上のアイコンをタップするだけで実行できるようにしてみます。

手順は次のようになります。

(1) 新規作成をする

  右の方の上にある + アイコンをタップ

  下向き矢印「 v 」をタップ

(2) アプリに名前をつける

  名称変更 をタップ

  アプリ名を入力

(3) アイコンを決める

  アイコンを選択 をタップ

  色を決める

  絵柄を選ぶ


(4) a-Shell アプリを利用する

  利用するアプリを指定

  「コマンドを実行」を選ぶ

  a-Shell のコマンドを + を押しながら入れていく


 この図以外にある赤い手書きのマークは、そこをタップすることを示していますが、
 この図の赤丸は、ここに本来の目的のCUIプログラムが含まれていることを強調しただけです。
 全部のコマンドを入力して下さい。
 そのほかのコマンドなどについては、この手順書の下で詳しく説明します。

(5) ホーム画面に登録する

  右上にある、丸の中に i の字があるマークをタップ


  出てきたダイアログで、右上の 追加 を 押す


  ホーム画面上に登録される


「コマンドを実行」で入力した それぞれのコマンドについて説明します。

  • clear ----- 画面をまっさらに消去します。
        a-Shell に残っている、直前に実行したものの文字を消す
  • cd -------- ショートカットから呼び出された直後の a-Shell は、いつものディレクトリ(~/Documents)とは別のところに居るので、
    このコマンドでいつものディレクトリへ移動する。
  • python bmiapri.py ----- 図で赤丸の印がついている場所です。
    実行したい自作のプログラムの a-Shell コマンドです。
    このサンプルでは前回投稿したプログラムを書いてありますが、ご自分の自作のプログラムを起動する a-Shellコマンドをここに記入してアレンジしてご利用下さい。
    perl nantoka.pl でも jsc nantoka.js でも lua nantoka.lua でも C言語で書いてコンパイル済みの実行ファイル名でも、お好きなように。
  • python osimai.py ----- CUI のプログラムを実行後に a-Shell を終了してしまったら実行結果を見る暇もなく画面が消えてしまいます。そこで一時ストッパーとでも呼ぶべき仕掛けをここに入れておきます。別に Python のプログラムでなくてもいいですが、何かキー入力を要求するコマンドをここに書いておきます。
  • clear ----- 後処理の一つとして a-Shell の画面を消去します。
  • exit ----- a-Shell を終了します。(iPhoneでもこの記事に書いた方法が使えなくはないのですが、なぜか、iPadと違ってiPhoneでは exit コマンドで a-Shell が終了してくれませんので、手動で終了する必要があります。)

私が使った osimai.py の中身は次の通りです。

print(" ")
print(" ")
print("return(改行)キーを押して終了します")
ans = input(" ")

CUIで太字や色付き文字や画面クリア

Pythonで文字ごとの色などを変更

単純な画面になりがちなCUIの実行画面を、メリハリのついた表現にするのに、エスケープシーケンスという強い味方があることに、最近気がつきました。 それで、エスケープシーケンスを生かした短いPythonプログラム(BMIの算出と肥満度)を作ってみました。

下のプログラムで使っているのは、画面消去: \033[2J 、カーソル左上移動(位置0,0) \033[0;0H 、太字: \033[1m 、修飾全解除: \033[0m 、赤文字: \033[31m の5種類だけですが、まだまだ沢山のコントロールができます。「エスケープシーケンス」、「文字の色を変える」「カーソル移動」などで検索すれば色々見つかると思います。

このプログラムはショートカットから起動して普通のアプリのように(あくまでもCUIでしかないのですが)見えることを心掛けたので、Pythonのエラーメッセージなんかが出力されるとドッチラケになると思い、キー入力(体重と身長)に対するエラーチェックを厳しくしています。 1回起動したら、画面の下の端で「y」を入力すれば、画面をクリアしながら何回でも計算できるようにしてあります。 あくまでもCUIですので、数値や「y」を入力した後に return(改行)キーを押してください 。

BMI&肥満度プログラム "bmiapri.py"


#! python

# 浮動小数点に変換可能な文字列か判定
def is_float(s):
    try:
        float(s)
        return True
    except ValueError:
        return False

# 肥満度判定
def decide(bmi):
    decision = Errmess
    for r in range(Nrank):
        if bmi < Rank[r]:
            decision = Fat[r]
            break
    return decision


# 事実上のメイン
def kernel():
    global Conti
    if Conti != "y":
        return
    print("\033[2J \033[0;0H") # 画面消去、カーソル左上
    print(" ")
    print(" ")
    
    print("\033[1m体重と身長からBMIを算出し肥満度を判定します\033[0m")
    
    print(" ")
    print("体重を入れてください")
    wei = input("            (kg) > \033[1m")
    print("\033[0m")
    print("身長を入れてください")
    hei = input("            (cm) > \033[1m")
    print("\033[0m")
    
    if is_float(wei) and is_float(hei):
        w = float(wei)
        h = float(hei) / 100.0
        if (w > 0) and (h > 0):
            bmi = w / h**2
            print("BMIは \033[1m" + str(round(bmi, 2)))
            print("\033[0m")
            print("判定は \033[1m" + decide(bmi))
            print("\033[0m")
        else:
            print(Errmess)
    else:
         print(Errmess)

    print(" ")
    print(" ")
    print("別の計算を続けますか?")
    Conti = input("y or n  > ")

# main
Rank = [18.5, 25.0, 30.0, 35.0, 40.0, 1000.0]
Fat = ["低体重", "普通体重", "肥満度1", "肥満度2", "肥満度3", "肥満度4"]
Nrank = 6
Errmess = "\033[1m\033[31m入力に誤りがあります\033[0m"
Conti = "y"
while Conti == "y":
    kernel()

※ このプログラムはフリーソフトとしますので、コピーしてご自由にお使いください。 下記のシステムで動作確認済みです。

iPadのa-ShellでFortran77

以前 iPad の a-Shell アプリに『 f2c 』というコマンドをインストールして、「 Fortran to C 」の略語だと思って、試してみたことが何回かあります。

例えば、Fortran言語で書かれたプログラムのファイル名を ftest.f とするとき、
 $ f2c ftest.f
と入れると、ftest.c というファイルが作られ、
その中身はC言語のプログラムみたいなので、
 $ clang ftest.c
とやってみましたが、エラーが出るばかりで、失敗でした。

それ以上先に進めないので諦めかけていましたが、先日、思い切って
作者( another_shell@icloud.com )宛にメールを送って問い合わせ、
私の拙い英語で何度かメールを交わしたところ、
親切に色々とアドバイスをもらって、実行ファイル a.out を作ることができました。

a-ShellでFortranコンパイルする方法について、作者とメールのやり取りをして分かった必要事項は、次の3つです。

⚫️ 最新の a-Shell アプリをインストール(あるいは更新)すること。
 (App Store から)
⚫️ 最新の f2c コマンドをダウンロードしてインストールすること。

$ pkg install f2c

 ( a-Shellのコマンドで)
⚫️ Fortran プログラムから実行ファイルを作る手順は、次の2つの a-Shellのコマンドを実行すること。

$ f2c 〈プログラム名〉.f
$ clang 〈プログラム名〉.c  -D_WASI_EMULATED_SIGNAL -lwasi-emulated-signal -Wl,--whole-archive -lf2c

f2c コマンドは問題ないが、clang コマンドは付けるべきオプションが長くて複雑なので、コンパイルのたびに手入力するのは間違いの元だと思って、この部分をなんとかしたいと思って、いろいろ試行しました。
シェルスクリプトで行けるのではないかと思ってやってみました。

clang pname.c -D_WASI_EMULATED_SIGNAL -lwasi-emulated-signal -Wl,--whole-archive -lf2c

という内容のテンプレートとしてのシェルスクリプト(仮にファイル名を forclangpname.sh としておきます)を作っておいて、各プログラムをコンパイルするときに、それをコピーして、ファイルの内容とファイル名ともに "pname" の部分をそれぞれ "new" などに書き替えれば

$ source forclangnew.sh 

とコマンド入力すれば new.c から実行ファイル a.out を作ることができます。

しかし、プログラムごとにシェルスクリプトを編集し直すのも手間がかかるなあと思います。
プログラム名をシェル引数として渡して dash という新しいシェルを使えばなんとかなるかと思い、

clang $1 -D_WASI_EMULATED_SIGNAL -lwasi-emulated-signal -Wl,--whole-archive -lf2c

という内容のシェルスクリプト forclang.sh を作成して

$ dash forclang.sh new.c

などとやってみましたら、うまくいきました。

それなら、ついでに f2c で pname.f から pname.c を作成する機能(Fortran からC言語へ変換)や、実行ファイル名を a.out から自動的にプログラム名に変更する機能も組み込んで、os.system 命令を使った Python のプログラムを作ったらもっと便利だろうなと思いついて作成したのが forclang.py です。

Python ソースプログラム "forclang.py"


#! python
import os, sys
args = sys.argv
fname = args[1]
if fname[-2:] == ".f":
    pname = fname[:-2]
else:
    pname = fname
    fname = pname + ".f"
comm = "f2c "+fname
os.system(comm)
comm = "clang " + pname + ".c" + " -D_WASI_EMULATED_SIGNAL -lwasi-emulated-signal -Wl,--whole-archive -lf2c"
os.system(comm)
comm = "mv a.out " + pname
os.system(comm)

★ 使い方 ★

プログラムをコピーして、"forclang.py" というファイルを作ってください。
(プログラム名はお好きな名前でもOK … for2run.py, f2clang.py, etc.)

それを Fortran のプログラム(仮に ftest.f としておきます)と
同じディレクトリー(フォルダ)に置いて、

$ python forclang.py ftest.f

とコマンド入力すると、
エラーがなければ、C言語の ftest.c と 実行ファイルの ftest が作成されます。

$ chmod +x forclang.py 

としておいたら、

$ forclang.py ftest.f 

と入力するだけでも実行ファイルが作れます。

$ mv forclang.py forclang 

として名前を変えておけば

$ forclang ftest.f 

だけでいいです。
コンパイラをインストールしたような気分)

Fortran プログラムと同じディレクトリーというしばりが嫌なら
a-Shell を起動した最初のディレクトリー( ~/Documents)の直下の
bin という名前のディレクトリーの中へ forclang を移動あるいはコピーしておけば

$ cp forclang bin/

 
カレントディレクトリーがどこであっても、

$ forclang ftest 

と入力するだけで ftest.f をコンパイルできます。

注意

この f2c コマンドを使う方法でコンパイルできるのは
最新の自由形式の Fortran 95 などではなく、
桁位置に注意する必要のある形式の、
少し古い Fortran 77 で書いたプログラムです。

forclang.py のプログラムの解説

プログラムの内容について知っていただくために、各行の働きを解説します。
説明のために、各行の頭に行番号を付けたプログラムリストを載せておきます。

     1: #! python
     2:	import os, sys
     3:	args = sys.argv
     4:	fname = args[1]
     5:	if fname[-2:] == ".f":
     6:	    pname = fname[:-2]
     7:	else:
     8:	    pname = fname
     9:	    fname = pname + ".f"
    10:	comm = "f2c "+fname
    11:	os.system(comm)
    12:	comm = "clang " + pname + ".c" + " -D_WASI_EMULATED_SIGNAL -lwasi-emulated-signal -Wl,--whole-archive -lf2c"
    13:	os.system(comm)
    14:	comm = "mv a.out " + pname
    15:	os.system(comm)

各行の解説

各行について解説します。
1: いわゆるシバン(shebang)です。このファイルが Python のプログラムであることを宣言し、chmod +x で実行ファイルとして使えるようにします。
2: 必要な2つのモジュール os と sys をインポートします。
3: シェルから forclang.py に渡された引数を受け取ります。
4: 引数を Fortran のファイル名としておきます。
5: 引数の最後が .f で終わっていれば
6: 最後の .f を除いた部分をプログラム名とします。
7: そうでなければ
8: 引数をプログラム名と見なし、
9: 引数の末尾に .f を追加した文字列を Fortran のファイル名とします。
10: f2c のコマンド行を作成します "f2c 〈Fortran のファイル名〉"
11: f2c コマンドを実行します。
12: clang のコマンド行を作成します。"clang 〈プログラム名〉.c -D_WASI_EMULATED_……"
13: clang コマンドを実行します。
14: できた実行ファイル名を a.out から〈プログラム名〉に変更するコマンド行を作成します。
15: 実行ファイルの名前を変更します。


似て非なるMacとiPadの画面

先日電気店で13インチのMacbook Air に触れていて感じたことを書きます。
最近のMacはアイコンの形やメニュー構成がiPadに似てきています。
それで、画面が小さめのMacbookに触れているとiPadと混同してしまい、つい画面に触れて操作しようとします。当然それでは何も操作できません。それでイライラさせられます。
iPadのユーザーに親しみをもってもらおうとして画面を似せても、それが却って失望を与えているようで、逆効果ではないかと、私には思えます。
いっそ全然違う画面デザインにして、その中でiPadのアプリも動作する、とした方が、親しみを感じるのではないかと思います。

a-Shellで日本語LaTeX


iPadの a-Shell で日本語を使った LaTeX の文書を作ろうと、これまで何回か試してみましたが、うまくいかないでいました。
今朝 App Store で a-Shellアプリ のレビュー記事を読んでいたら、LaTexで日本語文書を作るヒントになる『LuaTex-ja のクラスを使っていれば何の問題もなく日本語文書がコンパイルできます。』という記述を見つけ、ウェブ検索で補充的な内容を探索して、試行して、確実に LaTeX で日本語を使える方法が分かりました。

文書のファイル名を latexjasmpl.tex として話を進めます。

LaTeX文書の骨格は次のようにします。特に最初の2行が大切です。
(1行目の { } の中の1文字目は エル です。数字の1ではありません)
------------------------------------------
\documentclass{ltjsarticle}
\usepackage{luatexja}
\begin{document}
 日本語の文章など
 
\end{document}
------------------------------------------

この文書を次のコマンドを使ってコンパイルします。

 $ lualatex latexjasmpl.tex

最初にこのコマンドを利用したとき、環境によっては、必要な設定用ファイルや
フォントをダウンロードするために待たされることがあります。
2回目以降は待たされることなく、
画面上に何行も表示しながら、画面がスクロールしていきます。

最後に次のように表示されたら、
Output written on latexjasmpl.pdf (1page, xxxxx bytes).
Transcript written on latexjasmpl.log.

latexjasmpl.pdf というファイルが作成されています。

次のコマンドで、結果の文書を表示できます。

 $ view latexjasmpl.pdf



LiquidLogicでHTMLその2


JavaScript を使ったHTMLファイルをもう一つ紹介します。
解の公式を使って2次方程式を解く JavaScript のプログラムと
テキストボックスや、ボタンなどのGUI部品を使ったページを作成してみました。
以前自分の別のホームページで作成したものを今風にアレンジしてみました。
表示されるページの上部はタイトル画像のようなもので、
ホームページのHTMLソースは次のとおりです。

プログラム