2018年2月25日日曜日

お馴染みのforループですが...

 Cにも、C++にも、Javaにも出てくるお馴染みのforループですが、初心者にはその動作が分かり難い場合があるようです。英国ケント大学が開発しているBlueJというJavaの開発環境に関するフォーラムで、昨日ちょっと話題になった投稿を基に、以下に書きます。

-------------------------------------------
for(int i = 0; i<10; i++)
    System.out.println(i);
-------------------------------------------

 上記の例は、普通に使っているforループです。0〜9までをプリントするだけなのに、ローカル変数iを定義していて、しかも、それが4回も出現しています!また、その動作を確認しようと思って、各行にブレークポイントを設定してデバックしても、forとSystem.out...の2行が交互に実行(表示)されるだけで、有用な動作情報が得られません。そこで、

-------------------------------------------
for(
    int i = 0; 
    i<10; 
    i++
)System.out.println(i);
-------------------------------------------

 このように、forの中にあるローカル変数iの初期化、範囲検査、回数の増加操作を3行に分割します。そうして、それぞれにブレークポイントを設定してデバッグをすると、動作が良く分かります!という投稿でした。なるほど、確かにループ処理の動作を把握しやすい、という反応が多かったです。

 ところで(この投稿では言及されていませんが)、このようなfor文は何とも書きたくないですね。とても重苦しいシンタックスです。最近のJavaでは下記のようにも書けると知ると、従来のforは使いたくないですね。下記の例は、上記と同じことをするJava SE8 以降の書き方の一例です。ラムダ式とストリーム Lambda & Streams(ラムダ式は直接ここにはありませんが)が登場しているのです。

-------------------------------------------
IntStream.range(0, 10)
.forEach(System.out::println);
-------------------------------------------

 上のような従来型forループにあったローカル変数は全く使っていません!元々不要だったんですね。いや違うでしょう。従来に対する発想の転換の結果と言えるでしょう。よく言われることなのですが、次の違いがあります。
従来のforループ:howto、すなわち、どう処理するかの観点に立っている。ループインデックスをどのように制御して使うのか。
ラムダ・ストリーム:what、すなわち、何をするのかの観点に立っている。必要なデータを揃えて、それらに対して何をしたいのか、何を適用するのか。

2018年2月23日金曜日

JavaとApp Inventorの連携でより高度なプロトタイピング

 MIT App Inventorとその関連技術や応用については、これまでにかなり多数の記事を書いてきました。すでに、どこかで書いてことではありますが、再度、Javaとの連携について簡単にまとめます。今以上に高度なスマホアプリの素早い開発(ラッピドプロトタイピング)を行う際に思い起こして活用していただければよいと思います。

JavaとApp Inventorの連携3形態

1)App InventorのActivity Starterブロック
 これは当初からあった機能ですが、App Inventorのプログラムから任意のJavaプログラム(for Android)を呼び出してその結果を利用するためのものです。Javaプログラムを呼び出す際の引数の設定と、実行結果を取得するための設定には一定のルールがありますが、特に難しくはありません。
 例えば、App Inventor側にまだブロックが用意されていない新しいセンサーの値をリアルタイムに使いたいとします。その場合には、そのセンサ値を得るだけの小さなJavaプログラムを用意すればよい訳です。また、App Inventorには備わっていないような高度な数学ライブラリなどもJavaで作成すれば同様に利用できます。

(2)App InventorのExtensionsブロック
 これは比較的最近設けられた機能です。上記(1)と機能的には同様のことができるのですが、このExtensionsブロックには画期的な違いあります。(1)では、Javaプログラムを外部プログラムとして呼び出して使いましたが、こちらは、そのJavaプログラムの機能をApp Inventorの新しいブロックとして利用できるようにします!
 すなわち、ユーザが必要に応じて、(原理的には)誰でもApp Inventorをその言語仕様(インタフェース仕様)のなかで機能拡張することができるのです。「原理的には」と書いたのは、Javaを知っていればできるですが、かなり操作手順は入り組んでいます、という意味です。そのようにして新設されたブロックは、他の人も直ぐにそれを取り込んで使ったり、不要であれば解放することができます。
 これまでに、すでに、このExtensionsによるブロックは新たに数百個以上公開(一部は有償で販売)されています。リアルタイムDBであるFireBase人工知能関係機能、ファイルやネットワーク関係(BLE: Bluetooth Low Energy等も含む)など多彩なものがあり、現時点でも次々と発表する人が出てきています。まさに無限の拡張性を与えています!

(3)Java Bridgeによる連携
 これは、上記(1)とは逆の関係にあります。すなわち、この機能は、App Inventorのユーザ用ではなく、Javaプログラマーのためのものです。通常のJavaに比べて、Android用のJavaは(Android SDKを用いる)、スマホ特有のリソース管理の下で作成するため、特有の制約や込み入った制御があるため、一般には敷居が高くなっています。そこで、Javaから、App Inventorブロックの豊富で使い易い機能を呼び出して使えるようにしたということです。App Inventorの各ブロックは元々Javaで書かれており、それぞれJava Classになっているわけですから、(原理的には)そのようにできるはずです。サンフランシスコ大学のProf. David Wolberのところでこれが開発されました。

2018年2月19日月曜日

昔の情報工学実験1の模様(ビデオ)

ファイル整理していて、懐かしいビデオが出てきました。
旧情報工学実験1(テーマ:サーバサイドJAVA)です。
撮影は2007年6月となっています。
たしか、この年の3月に、現在の情報学部棟が新築されたはずです。K1-301, 302の実験室をぶち抜き出使っています。

ビデオの冒頭には、その前の年の秋に撮影した情報学部棟の建築中の映像も少しあります。その頃在籍していた人には懐かしいものですね。



このビデオは、当時のiPod(今のiPadじゃありません)の小さなウインドウで見るために編集した記憶があります。約90秒です。その際、かなり画質を落としてありますので、いまPCで見たりすると綺麗に写りませんが、それでも、過去のひとこまを見るには十分です。

2018年2月11日日曜日

もっとやってみたかったこと

まだまだやってみたかっとことはあります。

少しはやりかけたが、まだまだこれから

大学は研究題材の宝庫です。
まだまだ利用できるデータや環境がある

2018年2月9日金曜日

1971年製カシオの電卓

 懐かしい電卓のお話です。

 机の中を整理していたら出てきたのが、下記の「カシオ製電卓 Pocket-mini」です。1971年くらいに、発売と同時に購入しましたので、実に、47年前のものです。学科の教職員の方の何人かはまだ生まれてなかった時代でした!

 現在のような液晶ではなく、(多分)ニキシー管という名の赤く細いワイヤーのようなもので表示されるのが懐かしい。価格は当時、確か1万5千円くらいでした。電卓は、その名のとおり、会社などで机上において使うものであり、個人が持ち歩くものではなかったですから、高価でした。

1971年の初期モデル

今も動いていることの証明:大学の住所の末尾を表示

 裏側の電池を見てください。こんな古い電卓に、最新のエネループ電池。しかも、単なるエネループじゃないです。田中博研究室開発の人力自転車による発電(正式名称が違っていたらすみません)で充電されたものです。この組み合わせがなんともいいじゃないですか。

最新の人力発電による電池との組み合わせがクール!

さらに、関連情報です。このCasio Pocket-miniの3年後の後継機で1974年発売のものは、米国スミソニアン博物館にも展示されている?ようです。そのWebページは以下にあります。


米国スミソニアン博物館のもの。私の所有型に対して緑のボタン(メモリ機能)が一つ追加されているようです。(上記URLから引用)