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

2020年4月11日土曜日

NetLogoに親しむ(Desktop版とWeb版)

【要旨】NetLogoによるマルチエージェントモデリングを、ひとつの簡単な例題で説明するチュートリアルです。ただし、NetLogoの基礎知識は前提としています。通常のDesktop版に加えて、Web版のNetLogoについても小生の体験を記します。

■ NetLogo(通常のDesktop版)を使った基本的な例題
 まず、基本的な例題をひとつ示します。「朱に交われば赤くなる」といった感じのシミュレーションです。具体的な説明は、下記のNetLogoソースの先頭や、各ステートメントのコメントをご覧下さい。人々の交流で各人の特性(ここではそれを色で表現)が次第に均一化する状況を示しています。特性(色)の平均や標準偏差の推移も表示しています。

初期状態(左上:人の色の度数分布、右側:多様な色の人々)
反復(epoch)93回後の状態(色の度数分布がそれらしい形に)
反復(epoch)267回後の状態(ほとんど全員が同じ色に)

 人々の色の標準偏差が非常に小さくなった( 反復267回)後に停止しています。このプログラムの完全なリストを以下に示します。40行程度の小さなプログラムです。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NetLogoソースプログラムリスト;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;【他人に染まれ!】  Fujio Yamamoto, 2020-4-9
;; 各タートルは、ふらふら動き回っています。行く先々で、近隣の
;; タートルの色の平均値を少しだけ取り入れ、自分の色を少し変更します。
;; 各タートルの色は、最終的にどんな色になるでしょうか
globals [color-mean color-sd fr] ;; 大域変数
to setup                  ;; 初期設置
  ca                      ;; エージェントをクリア
  random-seed seed        ;; 乱数のseed
  crt population [        ;; タートルを指定個数生成。各タートルに対して、
    set shape "person"    ;; タートルの図柄を設定
    set label who         ;; タートル番号を表示
    set label-color black ;; ラベルの色
    setxy random-xcor random-ycor ;;ランダムな位置に配置
  ]
  ask patches [set pcolor 119 - random 2] ;; パッチの模様
  color-stat              ;; タートルの色に関する統計
  reset-ticks             ;; 時計をリセット
end
to go                     ;; ボタンを押すたびに実行される
  clear-links        ;; 結線を消す
  color-stat         ;; タートルの色に関する統計
  ask turtles[            ;; 各タートルに対して以下を実行する
    rt random 30 + random -30  ;; 少しふらふらさせる
    fd 0.1                    ;; その方向へ0.1歩前進する
    ifelse N4? ;; 「近隣」の選択
      [ set fr turtles-on neighbors] ;; 近隣東西南北4カ所のタートル達
      [ set fr turtles-on patches in-cone 3 60];; コーン内のタートル達
    if count fr != 0            ;; その個数が0でないならば、
    ;; それらのタートル達の色の平均値の5%を取り入れて、自分の色を変更する
      [ set color 0.95 * color + (0.05 * sum [color] of fr) / (count fr)
        create-links-with other fr [set color black] ;;交流関係を示す結線
      ]
  ]
  tick ;; 時計を進める
  if color-sd < 0.2 [ clear-links stop]  ;; 色の標準偏差が十分小さくなるまで
end
to go-once
  go
end
to color-stat ;; タートルの色に関する統計
  set color-mean mean [color] of turtles ;; 色の平均
  set color-sd standard-deviation [color] of turtles ;; 色の標準偏差
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

■ 上記プログラムの簡単な説明
 人々は少しづつ動き回りますが、その先々で近隣の人々と交流します。その「近隣」の定義は、以下に示すとおり、東西南北か、またはコーン状の範囲で決めるかを選択できます。

ifelse N4?  ;; N4?はスイッチの値。frは、近隣の人々の集合(リスト)
      [ set fr turtles-on neighbors] ;; 近隣東西南北4カ所のタートル達
      [ set fr turtles-on patches in-cone 3 60];; コーン内のタートル達

 ここで、"neighbors"は、東西南北のパッチ上にいる人々のセット"fr"の取得のために、また、"in-cone 3 60"は、距離3で前方60度の範囲のパッチ上の人々のセット"fr"を取得のために使います。次に、交流関係を示すため、自分自身とこれらの人々を黒線で結びます。後者のセット"fr"には自分自身が含まれているので、これを除くため、"create-links-with other fr"を使っています。

 人々の「交流の効果」は、以下のように、自分の色(color)に反映させています。
set color 0.95 * color + (0.05 * sum [color] of fr) / (count fr)
;; それらのタートル達 fr の色の平均値の5%を取り入れて、自分の色を変更する

 色の平均と標準偏差は、それぞれ、"mean"、”standard-deviation”で得られます。そして、各色(色の値は0〜140)の度数分布グラフは、"histogram"で描くことができます。具体的には、以下のとおりです。

set-plot-x-range 0 140 ;;x軸の範囲
set-plot-y-range 0 count turtles ;; y軸の範囲
set-histogram-num-bars 35 ;; ヒスとグラムの棒の数を35とする
histogram [color] of turtles ;; 色のヒストグラムの描画

■ ブラウザで利用できるNetLogo Web(ここにあります)
 これまでのNetLogoは、パソコン(Windows, Mac, Linux等)のアプリケーションとして動きますが、例えば、スマートフォンでは使えませんでした。しかし、web版(NetLogo Web)が公開されているので、スマホのブラウザからも使うことができます。早速、上記の例題をNetLogo Webで動かしてみました。その結果は下図のとおりです。

iPad miniのSafari上でのNetLogo Web(上記例題は完全に動作した)

 このWeb版はまだ機能不足と言われていますが、上記例題に関しては完全に動作しました。素晴らしい!スマホでは、ボタンやスライダーは非常に小さくなってしまい(拡大はできるものの)使い難いですが、完全に動作します。また、上図右上に(この図ではみえにくいですが)、「export HTML」というボタンがあります。これを押すと、このプログラム全体を、単一のHTML/JavaScriptファイルとしてダウンロードできます。これを、自分でwebサーバに配置すれば、他のJavaScriptプログラム等から呼び出すことができて、応用が広がりそうです。

■ ファイル入出力の違い(Desktop版とWeb版)
 今後NetLogo Webを使って行くにあたり、外部とのやりとりのためのファイル入出力(テキストファイルに限りますが)についても少し調べました。いくつかの理由から、Desktop版とWeb版には以下に述べるような違いがあります。

【Desktop版】テキストファイルの入出力例
file-open "input.txt"
while [not file-at-end?]
  [show file-read show file-read show file-read]
file-close

file-open "output.txt"
file-write 3.14 file-write "pi"
file-close

【Web版】テキストファイルの入出力例
●extensionを2つ宣言する。
extensions [fetch send-to]
こう書くと、自動的にextensionsが取り込まれる。最初はプロンプトが出るが。

●ファイル入力
非同期 asyncなので、ファイル入力が終わる前に、次のコマンドへ行ってしまうので注意して使う!
test-fetch-user-file-async 
to test-fetch-user-file-async
  fetch:user-file-async show
end

file名は、プログラムには書けない!上記のように書くと、file chooserが出現するので、そこで入力ファイルを選択する。「fetch:user-file-async」がファイル入力コマンドである。その後ろの「show」は、コールバック関数として指定したもの。つまり、ファイルが読み込まれた後、「show」の所に、処理すべきコマンドを書けばよい。

●ファイル出力
以下のように書く。ただし、出力ファイル”out.txt”はダウンロードされてしまうようである。
test-send-to-user-file
to test-send-to-user-file
  send-to:file  "out.txt" "result"
end

Thanks

2020年4月4日土曜日

Visualizing the progress of virus infection (No.2)

The application shown in the previous article has been upgraded as follows:

This is an enlightenment application to deal with the new coronavirus. The app simulated the spread of the infection based on what percentage of infected people moved for commuting or entertainment. You can watch the video in three cases. Watch this video and fight without loosing your defenses against the virus.


This app (.apk file) can be downloaded from here.

2020年3月31日火曜日

Try NetLogo Web with Android app

NetLogo for multi-agent modeling has been used to create desktop applications. On the other hand, NetLogo Web, which is almost compatible with NetLogo, is also available. See the figure below.


Let's compare the Desktop version and Web version with the following example. The example is "Visualizing Infection" shown earlier. Click here for more information. In the Android application shown below, the NetLogo model created in the Desktop version is executed on a PC in advance, and the execution process is stored in a video file for each parameter set and used. The video works perfectly, but you cannot run simulations on another new dataset with this app. Of course, this isn't necessary for this app.

Use video of the execution process of Desktop NetLogo

On the other hand, if you want to run a NetLogo model in an Android application corresponding to an arbitrary parameter set, you can use the NetLogo Web version. The figure below illustrates this. The operability was not good, such as the sliders and buttons being very small (although they could be enlarged), but they worked. So in some cases, this NetLogo Web might be good. Also, as you can see at the bottom, there is a great merit that you can edit the source code on the spot.

Incorporate NetLogo Web version into Android application

2020年3月29日日曜日

新型コロナウィルス:simple is (the) bestな解説

 難しそうなことのポイントを、専門知識を前提とせずに、優しく、丁寧に、かつ簡潔に解説してほしい。それは誰もが思うことです。新型コロナウィルス関係で、私が感じ入ったそのような解説3例 (A), (B), (C)をご紹介したいと思います。

-----------------------------------------------------------------
【追記】山中伸弥教授のホームページ[1]に書かれた「5つの提言 2020-3-31」を拝見し、下記のうちの最後の解説(C)について、小生のおもいを追加します。確かに、数学的には解説(C)の内容は納得できますが、山中教授の提言どおり、今はそう言っている場合じゃない。検査態勢を拡充し、徹底的に検査すべき段階なのかも知れません。専門家のひとりがおっしゃっていましたが、「今日正しいと思っていることが、明日は違っている」と言う状況なのかも知れません。
-----------------------------------------------------------------

(A)コロナウィルスの仕組みについてのやさしい解説
 新型コロナウィルスに関する山中伸弥教授のホームページ[1]のなかで紹介されている「動画で学ぶ」のひとつに、免疫研究者(スタンフォード大学中内研究室の新妻耕太氏)によるユニークな、やさしく本質に迫る解説[2]があります。「やさしいコロナウィルス解説-専門用語全然使わないチャレンジ-」というタイトルにふさわしいものです。約3分間のビデオ8本のシリーズとなっています。あっというまに、引きつけられて全部観てしまいました。特徴をとらえた大胆なイラストを用いて、コロナウィルスとは何か、どうやって体内入り増殖するのか、人-人感染の仕組みとは、等々を理解することができます。素晴らしい!さらに感心したのは、日本政府の専門家会議の報告にある3つの「密」を避けることもいち早く取り入れ、警鐘を鳴らしている点です。

新妻耕太氏のYoutube動画[2]より引用

(B)なぜ家に留まるべきなのかを、ずばりひとつのGIF画像で解説
 世界的に新型コロナウィルスが猛威をふるい感染が拡大している状況において、Sigal Samuel[3]は、「なぜ家に留まるべきなのか」を的確に説明しています。使っているのは一つのGIF画像(少しづつ変わる34枚の画像で構成)だけです。これが、ずばり、その根拠を示してくれます。単純な画像であるがゆえに、インパクトがあります。これも素晴らしいですね。基本的な用語Ro(基本再生産数)の説明も交えながら、(英語ですが)やさしい説明文もよいと思います。

Sigal Samuel[3]の解説から引用


(C)検査をむやみに行っても意味がないことを、やさしい数学で解説
 コロナウィルス感染の拡大状況にあって、もっとどんどん検査をやるべきという論調も見受けられるのですが、このビデオ[4]をご覧いただければ、そうではないなあ、と納得できるのではないでしょうか。ただし同時に、ある程度疑わしい人に絞って検査することの重要性も説いています。「ベイズの定理」という用語には意図的に触れていないようです。それは分数の計算だけで、「条件付き確率」の意味をやさしく伝えたいということだと思いました。数学から遠のいてしまった大人はもちろん、小中学生でも理解できるのではないでしょうか。(小生は、小中学の数学に疎いのでまちがいかもしれませんが)Youtubeをこんな風に有効に活用できるという好例でもあります。

条件付き確率に関するYoutubeビデオ[4]より引用


参考資料
[1] 山中伸弥による新型コロナウイルス情報発信
https://www.covid19-yamanaka.com

[2] 新型コロナウイルス感染を理解するためのやさしい生物学-新妻免疫塾
https://www.youtube.com/watch?v=yM9wCG23iQ0&list=PLhZK0Os7ExEEP3wydYgVJnYw3eD3uQvv4

[3] Sigal Samuel:How you can keep thousands of people from getting coronavirus, in one GIF
https://www.vox.com/future-perfect/2020/3/26/21193851/coronavirus-covid-19-staying-home-social-distancing

[4] むやみな検査を行ってはいけない理由、数学的に説明します【条件付き確率】
https://www.youtube.com/watch?v=67FGN9RKmqw

2020年3月26日木曜日

梅の形のえびせん

 世界的な不安が迫り来るなか、ちょっとしたことでもいい。何か明るい話題や出来事がほしい。それに該当するほどではないですが...

 えびせんをぼりぼり食べながら仕事(というほどでもないが)。季節限定の紀州の梅味です。なかなか出ないのですが、出たらハッピー!「梅形のえびせん」が、3個も出てきました!少しでも良いことが起こればいいのですが...

2020年3月24日火曜日

Visualizing the progress of virus infection (No.1)

Notice:On 2020-3-25, the following content was released as an Android app to the MIT App Inventor Gallery.
ai2.appinventor.mit.edu/?galleryId=4888454785269760
This article is written in Japanese. If you want to read in English, please use Google Translate, Microsoft Translator, and so on.
Click here for a description of the new version (on 2020-4-4).

【要旨】新型コロナウイルス感染症対策専門家会議の報告を理解するために、マルチエージェントを用いて、感染状況の可視化を試みました。

■感染症流行の基礎知識を得る
 今回の新型コロナウィルスを含む感染症流行の詳細な予測数理モデルは、文献[1]等にあります。微分方程式を用いた難しい説明もありますが、「基本再生産数」「実効再生産数」など基礎知識は得られると思います。また、資料[3]には、「集団免疫」の考え方の解説や、感染状況のビジュアル化が示されており、非常に参考になりました。資料[4]には、現状のとらえ方と今後の警戒の引き締め等が分かりやすく書かれています。

■日本国内の状況の理解
 上記から基礎知識を得たとはいえ、小生は全くの素人なので、以下の記述には誤解や間違いがあるかも知れません。それを前提で書かせていただきます。「新型コロナウイルス感染症対策専門家会議」の報告[2]とそれに関する優れた解説[3]を読んで、小生が理解したポイントは以下のとおりです。

(1)なんとか持ちこたえている。この感染症を一定の制御下に置くことができている。
(2)国内で感染が確認された人のうち約80%の人は、他の人に感染させていない。
(3)このウィルス実効再生産数は現在0.7程度に抑えられており、これまでの対策が一定の効果を発揮している。
(4)今後、どこかの地域を発端とした感染爆発の可能性もある。継続した警戒、対策が不可欠。

 図1に、上記項目(2)と項目(3)の状況をビジュアル化しています。ある集団に、感染者が3名が発生したとします。このうち、例えば感染者(A)は、近隣の3名に感染させ、そのうちの1名はさらに他の人へ感染を広げています。残りの2名はその後他人に感染させることはありませんでした。感染者(A)、(B)、(C)とも、最大でも数名の第三次感染者を出したところで拡大は停止しています。これは、発症に対して、隔離や治療が適切に行われた効果を反映しています。
 この図では、感染者のうちで他人へ感染させなかった人の割合は83%になります。また、実効再生産数は0.78であり、上記項目(2)、項目(3)の数値にほぼ合致しています。したがって、本図は、現在の実際の感染状況を理解するのに役立つのではないかと思います。


■感染爆発する状況もビジュアライズ
 感染の本格的なシュミレータなど([5][6])も様々作成されています。ここでは、もっと単純に感染状況を可視化したいので、自作することにしました。それには、かって利用していたNetLogo(マルチエージェントモデリング開発環境)[7]を使います。ある大学の情報工学科のブログ記事[8]に、「ないものは作るしかない、ということで(似て非なるものはありますが)、作りました」という言葉があり、それに触発されて作りました。

 図1は、作成したプログラムを使ったものです。このプログラム(モデル)の仕組みは非常に単純であり、以下のような枠組みです。

(a)感染者の発したウィルスは、近隣(N,NE,E,SE,S,SW,W,NW)の人に一定の確率(Th1)で達する。
(b)ウイルスが到着した場合、その人は一定の確率(Th2)で感染する。
(c)感染した場合でも、一定の確率(Th3)でそれ以上他人に感染させることはない。
(d)感染までの期間、持続期間や移動による影響などは考慮していない。
 (ただし、改訂版アプリ-2020-4-4では、感染者の移動も考慮しました。)
(e)単位時間毎に、感染するかしないかは、単純にパラメータ(a),(b),(c)で決まる。

 この図1は、感染対策が行き届いている状況を反映するように、パラメータ(Th1, Th2, Th3)を設定して実行した結果です。つまり、上記で理解した項目(2)と項目(3)の数値に近づくようにパラメータ調整したものです。その結果が妥当であれば、次に、感染対策を怠った(あるいはかなり緩和させた)場合の感染爆発も、これらのパラメータ調整で表現できるのではないでしょうか。あまり確信はありませんが。

■シミュレーションの実行例
 以上の検討にもとづき、2つのケースのシミュレーションを行いました。図2は、両方に共通の開始時点の様子です。人口834名の集団に6名の感染者が発生している状態から出発します。


 図3は、感染対策が功を奏している場合であり、上に示した図1は、この図の一部です。短いビデオも添付しました。


図4は、不運にも感染爆発してしまったケースです。資料[3]によれば、ドイツのメルケル首相は、「対策を取らなかった場合、ドイツ国民の60%〜70%が新型コロナウイルスに感染する可能性がある」と述べたとのことです。メルケル首相は物理学者でもあったので、その発言には根拠があるはずです。実際、基本的な計算式に当てはめると、基本再生産数3の場合(新型コロナウィルスがこれに該当)、初期に免疫を持った人がおらず、何も対策をとらない場合、感染者が集団免疫となり収束するまでに、全人口の67%が感染するとのことです。図4の結果は、感染爆発が収束するまでに、69%の人が感染することを示しおり、(偶然でしょうが)この数値に良く合致します!?


以上、極めて単純なシミュレーション(というよりも状況の可視化)ですが、ご参考になる点があれば幸いです。

参考資料
[1]西浦博、稲葉寿:感染症流行の予測:感染症数理モデルにおける定量的課題、数理統計第54巻第2号、pp. 461-480、統計数理研究所(2006)
[2]「新型コロナウイルス感染症対策の状況分析・提言」(2020/3/19)
新型コロナウイルス感染症対策専門家会議
https://www.mhlw.go.jp/content/10900000/000610566.pdf
[3]浦島充佳:日本で新型コロナが「感染爆発」しない理由(2020/03/19
https://forbesjapan.com/articles/detail/33158/1/1/1
[4]忽那賢志:新型コロナのオーバーシュート(感染者の爆発的増加)を起こさないために我々にできることは?
https://news.yahoo.co.jp/byline/kutsunasatoshi/20200322-00169120/
[5]Marco J. de Vries:Virus2
http://ccl.northwestern.edu/netlogo/models/community/Virus2
[6]Yang, C. and Wilensky, U: epiDEM Travel and Control
https://ccl.northwestern.edu/netlogo/models/epiDEMTravelandControl
[7]山本富士男:マルチエージェントシステム構築のためのNetLogoを学ぶ
https://sites.google.com/site/yamlabnetlogo/
[8]神奈川工科大学情報工学科ブログ記事「ただいま、仕込み中」
http://blog.cs.kanagawa-it.ac.jp/2020/03/blog-post_19.html


2020年3月19日木曜日

もう一つのJavaアプリケーション開発環境 BlueJ

【要旨】教育向けの、Javaアプリケーション開発環境として、BlueJがあります。大学で使用されている下記の著名なJava教科書の幅広い例題をこれで稼働させて、その有用性確認しました。

■BlueJについて
   Javaアプリケーション開発環境として、Eclipseは広く普及しています。これに対して、BlueJ[1]は、約20年の歴史を持つ、教育向けの優れたJava開発環境として知られています。Oracleがサポートし、J. Goslingも絶賛しています!国内では知名度はあまり高くないようですが、日本語解説書[2]もあります。Eclipseは、Java以外の言語での開発も可能な非常に高機能なのに対して、BlueJはJavaに特化した簡潔で親しみやすい特徴があります。したがって、もしも、現在大学のJava授業で使われている最も高度と思われる教科書[3]の例題が、全て完全に動くのであれば、BlueJを使うという選択肢も生まれるのではないか。今回の記事はそれを検討したものです。


■今回の実証実験に使用した教科書の例題
   多くの大学で利用されており、Javaの基本事項を幅広く網羅した高度で精緻な以下の教科書[3]の例題を対象としました。これらの例題は、Java8に準拠したものですが、BlueJの最新版はJava11に準拠しています。したがって、言語仕様面からは問題なくBlueJでも動くはずです。しかしながら、現実には、実行環境の相違などから問題があるかも知れません。それを確認するのです。


   この教科書の例題は膨大な数に上りますので、できるだけ広範囲に考えて、以下の8題を選択して検証することにしました。

第5章:T51.java
  (1)クラスとメソッドを説明する、簡単なタートルグラフィックス
第6章:Args61.java
  (2)mainメソッドに実行時に与えられるパラメータの利用
第12章:ExecutorExample.java
  (3)エグゼキューターサービスを用いた平行実行。ラムダ式も使用。
第12章:StreamTurtle.java
  (4)並列ストリームの処理の流れ。ラムダ式も使用。
第14章:Standup.java
  (5)JavaFX、CSSファイル、アクションイベント処理
第15章:ShapeEventExample.java
  (6)JavaFX、マウスによるShapeイベント処理
第16章:FileReadWrite2.java
  (7)テキストファイルを行毎に読んで表示
第17章:WeatherClient.java
  (8)HTTPクライアント。外部jarでJSONファイルデコード。

■BlueJのプロジェクトとパッケージ
   ここでは、Mac版BlueJを使いますが、特に何の設定も無しにすぐに使えます。Windows版でも同じだと思います。また、Raspberry Pi等には標準でBlueJが組み込まれているようです[4]。
 
   上記例題のJavaソースファイルは、それが属する章の名称(例えば第17章ならばchap17)のパッケージに入っています。BlueJのプロジェクトでも、パッケージ構造はそのまま使うことができます。下図をごらん下さい。なお、各パッケージを開くと、それに属するJavaソースファイル名を確認できます。クラス間の依存関係は、自動的に矢印で表示されます。非常に見やすく、親しみやすいと感じます。


■BlueJでの実行状況
   予想どおり、上記8題は特に問題なく、完全に動作しました。ソースコードの変更は一切不要でした。言語仕様の上位互換性からこれは当然ではありますが。ただし、画像ファイル、テキストファイル、CSSファイルの配置場所は、プロジェクトの直下にします。これは、Eclipseの場合と同じですが、環境が違うので注意が必要です。また、例題(8)でのJSONを扱うための外部jarファイルを取り込む手順、例題(2)でのmainメソッドに実行時パラメータを与える方法に注意すればよいです。詳細は、末尾のTipsをご覧下さい。

   以下に、例題(3)と例題(8)の実行状況を示します。ソースファイルエディタも、構造が色分けされて見やすいと思います。



■結論
   以上の検討結果(8題の実行実験)から、恐らく、この教科書のぼぼ全ての例題は問題なく実行できるという感触を得ました。したがって、BlueJは、大学でのJavaプログラミング環境として十分活用できると思われます。Eclipseよりも軽快であり、必要にして十分な機能があると考えます。特に、初心者にはより優しい環境であり、親しみやすく、取り組む意欲を低下させないと言えます。

Tips ...

 (1) 画像、テキスト、CSSファイルの配置
   プロジェクトの直下(パッケージの中ではなく)置けば、"lay.jpg"のように、ファイル名を直接指定することで参照できる。もしも、これ以外の別の場所に置くのであれば、以下のように、絶対パスで参照すればよい。
private static final String RESULTS_FILE = "results.txt”;
Path resultsFile = Paths.get(RESULTS_FILE).toAbsolutePath();
FileWriter writer = new FileWriter(resultsFile.toString());
また、例えば、 "results.txt”ファイルをパッケージresに置くのであれば、"/res/results.txt"として参照できる。
CSSファイルは、プロジェクトの画面に出現するが、テキストや画像ファイルはそこには現れないので、別途何らかの方法で参照する。

 (2) 外部jarファイルの追加
   jarファイルを、プロジェクトの直下へ配置する。その後、
BlueJ -> カスタマイズ -> ライブラリで「ユーザライブラリ」に、AddFileを押して、jarファイルを指定 -> OKを押す。
その後、BlueJを再起動すれば、そのjarファイルのクラスをimportできる。

 (3) mainメソッドの引数に、実行時にパラメータを渡す
   mainメソッドを起動するウインドウに{ }が出現するので、その中に、以下のようにパラメータを指定する。各パラメータとも、ダブルクオーテーションが必要。
例:{"apple", "orange", "10"}

参考資料
[1] BlueJ公式Webサイト
https://www.bluej.org
[2] 深瀬欽正:Java新入門 学習環境BlueJでスイスイ、リックテレコム
[3] 立木秀樹・有賀妙子:すべての人のためのJavaプログラミング第3版、共立出版
https://www.i.h.kyoto-u.ac.jp/users/tsuiki/javaEveryone3/index.html
[4] Raspberry PiでのJavaコーディング
https://www.oracle.com/webfolder/technetwork/jp/javamagazine/Java-JF15-NewToJava.pdf



2020年3月7日土曜日

Ideas into Reality

 あるシンポジウムで、短い口頭発表を行う予定でしたが、新型コロナウィルスの影響でそれは中止になりました。そこで、中止発表当日に!完成したスライド16枚とその説明をここに掲載したいと思います。Web自主発表?です。(オンライン発表ではないですが。)

[末尾に、参考資料を追記しました。2020-3-10]

    AIの適用が拡大しています。そして、個人のニーズと嗜好の多様化に伴い、個人的な面でもそれは拡大しています。その背景として、AI活用の容易化、そして、AIはブラックボックス的でもあるが使える!という機運の高まりがあります。ここでの目的は、「Ideas into Realityの推進」にあります。具体的には、AIを活用した数例のアイディアを検討し、それを高レベルの開発環境で迅速にプロトタイピングできることを示します。それをさらに多様なAIアプリケーションの開発力向上に繋げて行きたいと思います。

    そのAIアプリケーション開発ですが、開発環境を概観した図がこちらです。様々な環境に包まれていますが、ここでは、緑色で示した「高レベル学習モデル作成」と「スマホアプリ開発環境」、それといくつかの従来型プログラミング言語とライブラリを使って行きます。

    これまでに、AIを活用したいくつかのアイディアを発案し、それを実装してきました。あまり難しいものはありませんが、こちらに示すようなものです。今回はそのうち、(1)ニューロンをmicro:bitで実装、(2)綺麗な風景の自動認識、の2つについてお話します。

    最初のアイディアは「Neural Networkのニューロンの動作をmicro:bit[1]を使って実感したい!」です。こちらは、手書き数字認識をDepp Learningで学習している例[2]です。ここにあるニューロンひとつづつを、1台のmicro:bitで実装したいということです。しかしながら、そのためには、この例は明らかに複雑過ぎますので、非常に簡単な例を考えます。意味のある最も単純な例としてのXORの認識[3]です。ですが、根幹となるバックプロパゲーション[4]は実装します。それが肝なのですから。ところで、なぜこのような原始的な実装をするのか?それは、そうすることで、実感を持って理解が深まること、そして、なによりも楽しい!からです。

    こちらは、7台のmicro:bitの連携でXORを学習しているところです。論理的な結線を書いてありますが、実際には結線はありません。全て無線通信でデータをやりとりしています。先ほどのバックプロパゲーションですが、この手書きの式にしたがって、Pythonで20行ほどの短いプログラムとしてmicro:bitに組み込みました。なお、micro:bitは性能が低いので、学習を加速させるため、こちらのNetLogo[5]で予め辺の重みの大まかな値(近似値)を求めておき、それを使って出発させます。

 こちらは、その動作状況のビデオの一部です。バックプロパゲーションのフェーズから示していますが、次にフォーワードプロパゲーションになると、出力Zに結果の数値が(一桁づつ)表示されます。正解と出力Zの差が一定値以下になると学習が終わったことになります。この画面では、x=1, y=1に対して、出力Z= 0を学習した状態です。

    このビデオはYouTubeで公開[6]しているのですが、それが図のとおり、micro:bitの公式Twitterで紹介されました。micro:bitは主に学校向けでありますから、通常はこのような使い方はしないのですが、これが取り上げられたということは、研究成果も教育へ還元して行こう、という姿勢の表れではないかと考えています。

    次に2番目のアイディアです。曇りがちだが、晴れると美しい山があります。しかし、いつそうなるか分かりませんので、綺麗に見える時にスマホへ自動通知する、というものです。具体的には、北海道の北部に利尻岳があります。島になっています。隣の礼文島からこれを写しているライブカメラ[7]がありますので、それを利用します。ここが海峡になっていることもあり、通常は曇っていて、unluckyな状況ですが、時々、goodな風景になります。そして希に、山全体が見えるexcellentになります。このexcellentになった時に、スマホに自動通知し、さらに先ほどのmicro:bitに大きな山のイメージを表示します。

 こちらは、作成したスマホアプリです。動かしてみます。最初は、曇っているがgoodな風景です。次に、excellentなのが出てきます。最後の画面では、confidence 0.99でexcellentと認識されています。

    この場合の画像の学習は、Google Teachable Machine2[8]で行いました。ブラウザで行えます。すなわち、excellent, good, unluckyな画像をそれぞれ30枚以上用意すると、すぐに学習を実行できます。学習が終われば、ここに新たな画像を与えると、3つのうちのどれに該当するかが判定されます。これらの操作はブラウザだけで閉じて行えます。しかし、ここでは、Androidアプリで利用するため、後で、この学習済みモデルを取り出します。

    ところで、このTeachable Machineは非常に高レベルの開発環境なのですが、それを完全なブラックボックスとせずに、システムからのフィードバック情報に基づいた調整が必要です。すなわち、学習の進行に伴う誤差の低減状況や、ラベル毎の正解率が得られますので、それを見ながら、入力画像の適合性や枚数の調整、さらに、こちらにある学習用ハイパーパラメータの調整を行うべきです。

    Androidアプリケーションとして作成するためのファイルの構成がこちらの図です。先ほどの学習済みモデルはこちらですが、具体的には3つのファイルで構成されています。それを操作するための、短い、JavaScript, HTMLを作成して、それらを、AndroidのローカルWebサーバへ配置します。それを動かすための制御プログラムは、MIT App Inventor[9]で作成しました。

    この図が、そのApp Inventorプログラムです。明解なブロック型のプログラム構造になっていることが分かります。すなわち、(1)ライブカメラから分類すべき画像を得る。(2)その画像を取得できたら認識を開始する。(3)先ほどの学習済みモデルを使って認識を実行する。(4)認識が終わると最後のブロックが呼び出されるので、そのなかで、分類結果がexcellentであればnotifyする。という流れです。

    ここ1、2年で、大学などを中心に、AIやデータサイエンスの教育研究が急速に盛んになってきました。ここに挙げたのは一部に過ぎませんが、例えば、神奈川工科大学の研究ブランディング事業でAIシステム[10]というのもあります。これらの取り組みのなかでも、今回のようなIdeas into Realityの実践は重要になっていくのではないかと思います。

    まとめです。AIを活用したいくつかのアイディアとそのスマホ等での実現についてお話しました。そのなかで、高レベルな開発環境とPythonの併用、さらに、App InventorとJavaScriptとの連携の強みを確認できました。今後の課題としては、例題に留まらない、実用レベルでのAIの活用をさらに蓄積して行く必要を感じます。一方、AIが出した結果に従うことに慣れてしまう怖さも感じます。例えば、サラリーマン川柳に、「AIに 営業スマイル 審査され」[11]というのがあります。これは、ちょっと考えさせられる句ではないでしょうか。最後に、高レベルの開発であっても、原理、動作、結果を的確に把握して行くという姿勢が重要と考えます。

Thank you for your attention

参考資料
[1] Micro:bit Educational Foundation
https://microbit.org/
https://twitter.com/microbit_edu
[2] Deep Neural Networks and Dropout
http://modelingcommons.org/browse/one_model/4445#model_tabs_browse_info
[3] 高卒でもわかる機械学習 (3) 多層パーセプトロン
http://hokuts.com/2015/12/04/ml3-mlp/
[4] 高卒でもわかる機械学習 (6) 誤差逆伝播法 その2
http://hokuts.com/2016/10/09/bp2/
[5] Artificial Neural Net - Multilayer
https://ccl.northwestern.edu/netlogo/models/ArtificialNeuralNet-Multilayer
[6] BackPropagation in Neural Network with an Example (XOR) Using Multiple Micro:bits
https://www.youtube.com/watch?v=tsYr01lQ_HY
[7] 礼文町 ライブカメラ
http://www.town.rebun.hokkaido.jp
[8] Teachable Machine2
https://teachablemachine.withgoogle.com/
[9] MIT App Inventor
http://appinventor.mit.edu/
[10] 神奈川工科大学 私立大学研究ブランディング事業
https://www.kait.jp/topics/branding/
[11] 第33回サラリーマン川柳 優秀100句
https://event.dai-ichi-life.co.jp/company/senryu/

2020年3月2日月曜日

Decoding JSON by using new Dictionary Blocks

This article demonstrates the use of new blocks called Dictionaries [1] in MIT App Inventor. These blocks were announced in the releases nb181c and nb182 (February 18, 2020) and are mainly used for encoding and decoding JSON files.

By the way, I previously developed a JSON Decoding Extension. Examples of its use are shown below:
Another example using JSON Decoding Extension

In the following, I use the new Dictionaries to decode JSON file for the same example. This app displays the weather forecast using OpenWeather [2]. Here, I show the weather forecast for Sapporo City in Japan every 3 hours up to 5 days ahead. Fig.1 shows an example of JSON text output from OpenWeather. Some parts are folded in the figure, but if all are expanded, there are 1,341 lines.


Fig.2 shows an application that takes all the values for tags surrounded by a red frame in this JSON text and displays them on the smartphone. Namely, values for the city name, time, temperature, and weather are displayed. To use OpenWeather in this application, you need to obtain your own API Key.


This application uses Dictionaries blocks to decode JSON text. First, get the city name "Sapporo" as shown in Fig.3. The JSON text obtained from OpenWeather is processed by a web block, and the result is made into a list structure. (global jsonL). Next, the city name is obtained by the "get value at key path" method of the Dictionary block.


Next, to extract all the weather forecasts (time, temperature, description) every 3 hours, use the procedure shown in Fig.4. First, traverse the array that is the value of the "list" tag by specifying "walk all at level". The resulting list (global subList) is used in the subsequent blocks. For example, to get all the temperatures and put the result into a list structure, use the "list by walking key path" method. At this time, the element given as an argument is a list of (walk all at level, main, temp). Here, the order of the list elements is important. It is necessary to carefully specify the order while looking closely at the hierarchical structure of the JSON file. I think Fig.5 will help you understand it.




As a result of the above tests, I found that the new "Dictionaries blocks" can efficiently decode JSON files, similar to the "JSON Decoding Extension" described above.

References
[1] MIT App Inventor Dictionary Blocks
http://ai2.appinventor.mit.edu/reference/blocks/dictionaries.html
[2] OpenWeaterMap API guide
https://openweathermap.org/guide