1.1 Javaアプリケーションの開発,WindowsでもLinuxでも
第1回授業ではOSはWindows,開発環境はEclipseを用いましたが,これは2年後期の演習科目のやり方を踏襲しました.
次回以降はLinuxを使用します.コマンドラインからの,Javaのコンパイルと実行,およびそれを繰り返したプログラミングのやり方は,この機会に経験しておくのが良いと判断したのが,主な理由です.
当面の間はLinuxとし,その後,WindowsでTomcatを動かすとともに効率良くWebアプリケーションを開発できるための方法が確立すれば,Windowsでの開発も認めたいと思います.
1.2 SVG画像を生成するJavaアプリケーション
SVG画像の生成プログラムを,課題として選んだのは,サーブレットでHTMLを生成するプログラミングの基礎になると考えたからです.
サーブレットに限らず,プログラムでHTMLを生成した場合,引用符が抜けている,要素の対応がとれていないなど,中身が少々おかしくても,一応はブラウザで表示してくれます.
ですがXMLは,HTMLよりも厳密さが要求されます.巡回していて何人か,SVGファイルをダブルクリックしたとき,エラーが発生しているのを見かけました.
すぐにデバッグできていましたが,「プログラムが動けばOK」というわけにはいかないことを,学ぶ機会になったと思います.
1.3 前計算と出力を分ける
星形の座標の算出にあたり,forループでX座標とY座標を求め,そのつど,System.out.printで出力する,というのを期待し,実際多くがその書き方でしたが,何人かは,いったんすべての座標を求めてから,その後,System.out.printを並べて出力するという形をとっていました.それでもかまいません.出力もforループを使っていれば,なおよしです.座標を配列に格納し,そのように書いていた学生もいました.
前計算と出力とでフェーズを分けるのは,JSPやPHPなどの埋め込みHTMLでも有用なコーディング手法となります.
1.4 サーブレットのアノテーション
Javaサーブレットの動かし方に関して,Web上の情報によっては,実行したいサーブレットに応じてweb.xmlを編集すると書かれていたりもしますが,それは古い情報です.
最初に伸張してねと指示した,.tar.gzファイルの中には,Javaファイルのほか,web.xmlというファイルも入れていまして*1,サーブレットのJavaファイルに依存した記述をしていません.
その代わり,Javaファイルの中に,「@WebServlet」から始まる1行を入れています.
これはアノテーションと呼ばれ,Javaのあるバージョンより利用可能な機能です.行末にセミコロンを書かない点にも注意してください.
1.5 素数判定をAPIで
素数判定は,小さな値から割っていて割り切れるかを判断するという,素朴なやり方で,かまいませんが,JavaのAPIで行う場合には,java.math.BigIntegerクラスにあるisProbablePrimeメソッドが有用です.
それで,https://docs.oracle.com/javase/jp/8/docs/api/java/math/BigInteger.html#isProbablePrime-int-にある「public boolean isProbablePrime(int certainty)」をもとに,if (isProbablePrime(num))といったコードを書いている人を,巡回中に見かけました.でも,これでは失敗です.
isProbablePrimeは「インスタンス・メソッド」ですし,引数は素数判定をしたい値そのものではなく精度にしないといけないからです.(精度を大きくすれば,誤判定の確率を下げられる反面,処理時間がかかります.ネットワークセキュリティの授業で,解説します.)
代わりに書くべきコードの概略を示します.まずBigIntegerクラスの変数を用意し,new BigInteger(引数)により適当なインスタンスを作って代入します.あとはif (変数名.isProbablePrime(精度))を書けば,メソッド呼び出しにより素数判定をしてくれます.
1.6 ページを再読込しても表示されないときは
何人かから,コンパイルして少し待ち,ページを再読込しても表示されないと問い合わせがありました.
すべてではなかったかもしれませんが,無限ループを起こしている場合に,表示されない(Tomcatは無限ループを検知しない)可能性が考えられます.
反復処理を中心に見直すよう,指示しました.
なにこれ
月曜午後の演習科目で,授業中で解説できなかったことや,答案を読んで気になったことなどを,文章にし,受講者に読めるようにしています.
上記はその抜粋です.ブログ記事として公開するにあたり,修正も行っています.
*1:中身は,wikipedia:Java_Servletの「Web.xml定義」のバージョン3.0です.