2020年4月12日日曜日

MIT App Inventorでも、きらり光るUNIXシェル

【要旨】スマホアプリ開発環境であるMIT App Inventorに、UNIXシェルコマンドが使えるextensionが開発されました。ブロック型プログラミングにおいて、UNIXコマンドを使えるならば、応用範囲がさらに広まると考え、これを試行してみました。

AWKコマンド(言語)について
 まず、古い話から始めます。小生が大学教員となった1994年に、初めての私の3年生ゼミで学生と一緒に勉強したのが、テキスト処理のためのAWKです。3名の開発者による著名な下図の書籍[1]をテキストとしました。このゼミは、UNIXに親しもう!を旗印に始めたものです。

約25年前(1994年)の3年生ゼミで使っていたAWKの教科書

 この本は、訳者の足立高徳氏が序に書いている「... より一般的な原理や教訓をもわかりやすく提示していく筆の進め方はまさに絶品である」との言葉どおり、読者に深い感銘を与えました。

AWKの基本的な例題
 AWKは、同じUNIX上のfind、sed、grepといったテキスト処理系ツールと同じく、奥深いソフトウェアです。ここでは、上記の書籍にあった、以下のようなテキストファイルを対象にして検討します。「国名、面積、人口、大陸名」を記したテキストファイルから、下図の右側のような人口密度でソートされた結果を得たいとします。

テキストファイルから、人口密度でソートされた結果を得る

MIT App Inventorでテキスト処理する
 小生は、近年はMIT App Inventorを多用しています。上記の問題も、App Inventorでもちろん解けます。多様な、テキスト処理のためのブロックが用意されていますから、それはできます。しかしながら、App Inventorにおいて、AWKなどのUNIXコマンドが使えるとなれば、それは非常に有効と思います。UNIXの方が格段に短いスクリプトで効率的にプログラムが作れるはずだからです。

 それは、参考文献[2]に示したJuan A. Villalpando氏が開発した、App Inventor用のextensionで実現できます。もちろん、通常のUNIXと比べて、機能的に不足している点はあるようですが、基本的なコマンドが使えれば十分です。

 早速ですが、このextensionを使って、上記の問題(人口密度でソート)を解く、デモアプリケーションを下図のように作成しました。下図の中央にあるawkコマンドで実現されています。コマンド入力後にAWKボタンを押すと実行されます。なお、上辺にあるAWKのロゴは、入力ファイルを表示するボタンになっています!

App Inventorでawkコマンドを使う

 このextensionのおかげで、このアプリは、以下に図示するように非常に小さなプログラム(ブロック)で完結しています。

上記アプリのソースプログラム(ブロック)

AWK以外のUNIXコマンドも使ってみる
 このアプリでは、awkだけでなく、UNIX一般のコマンドも使えるようにしています。下図は、コマンドfind、grepをパイプで連結しています。この場合は、Othersボタンにより実行させます。この例では、スマホの外部記憶にある画像(.png)のうち、2020年04月がファイル名に含まれるものを列挙しています。このように、App Inventorのブロックでは少しやりにくいテキスト処理を、極めて簡潔に実行できる場面が多いと思います。

コマンドfind, grepも使ってみる

(注1) 本記事では、Android OS 10.0(Pixel 3a)で実行しました。他のOSバージョンでは不具合があるかも知れません。
(注2) printfでの桁揃えが一部、期待通りになりませんでした。
(注3) これはUNIXの問題ではありませんが、プログラムからテキストボックスに改行(\n)を含むawkコマンドなどを設定すると、そこで改行が実行されてしまいますので、注意が必要です。人手で直接テキストボックスへコマンドを入れる場合は問題ありませんが。

参考文献
[1] A.V.エイホ/B.W.カーニハン/P.J.ワインバーガー著、足立高穂訳:プログラミング言語AWK、アジソンウエスレイ・トッパン、1991年6月発行
(注)本書はすでに絶版になっていて、別の出版社が復刻版?を販売しているようである。

[2] Juan A. Villalpandoによる KIO4 Extension Terminal
http://kio4.com/appinventor/278_extension_shell.htm

0 件のコメント:

コメントを投稿