2005/10/16

Javaのお勉強 (2)

Sun MicrosystemsのサイトからJava Tutorial一式をダウンロードして、「Essential Java Classes」を勉強中。
  1. Exceptionの扱い。他のメソッドが返すExceptionをtry, catch, finallyで扱うとコードがすっきりする。自分で処理せずに自分を呼んだメソッドにExceptionを渡すこともできる。メソッドの定義時に throws <exceptionクラス名> を宣言し、Exception発生時に throw <exceptionオブジェクト> で返す。RuntimeExceptionの場合は明示的に宣言しなくてもよい。catchではなるべくspecificなExceptionのみを捉え て、 recovery strategyがはっきりしている場合のみを処理するようにする。1.4からchained exceptionが扱えるようになった。ThrowableクラスにはExceptionの他にErrorがあるが、JVMのfatalなエラーなどに 用いられるので、ユーザープログラムでは処理する必要が無い(処理するべきでない)。
  2. Threadを使うと一つのプログラム中で複数の処理を同時並列的に実行できる。java.util.Timerなど。Swingを使う場合はjavax.swing.TimerやSwingWorkerなどが便利。Threadのクラスはrun()メ ソッドの中に一連の処理を記述する。TimerTaskを継承してクラスを作り、オブジェクトをTimer.schedule()でスケジューリングす る。親スレッドの終了はtimer.cancel()、ただしAWTを使った場合はSystem.exit(0)とする。timer = new Timer(true)でdaemonスレッドを作った時は、子スレッドが無くなるとプログラムは終了する。
    生にスレッドを使うにはThreadクラスを 継承してrun()を上書き定義する方法と、Runnableインターフェースを実装する方法がある。Appletを作る場合はRunnableを 使う。
    スレッドがstart()で実行可能状態になっている時、sleep(), wait(), IOブロッキングのいずれかによってスレッドの状態は実行不可に遷移する。wait()を解消するにはnotify(), notifyAll()を使う。
    Threadクラスを終了するにはrun()を平常に終了させればよい。Threadのstop()は古くて危険なので今後は使わないこと。Appletの終了時にはユーザー定義クラスのstop()が呼ばれるので、変数などを利用してrun()に終了を伝える。
    リリース5.0ではスレッドの状態の検知にThread.getStateが使えるようになった。それ以前のバージョンではisAlive()を使う。
    大量の計算を必要とするrun()を持つスレッドでは、CPU資源を独占しないようにyield()を適宜呼ぶことが望ましい。
    複 数のスレッドであるオブジェクトのデータを共有する場合、そのオブジェクトをロック・解放した上で、データの受け渡しを互いに知らせる仕組みが必要と なる。共有オブジェクトをロックするには、そのメソッド宣言時にsynchronizedを使う。あるオブジェクトがsynchronizedメソッドを 読んでいる時、同じ共有オブジェクトの他のsynchronizedメソッドを別のオブジェクトが呼び出すことはできない(ロックされる)。共有されるオ ブジェクトはあるデータが共有できるタイミングになるまでwait()で他のメソッドを呼んだスレッドのロックを解除する。データの準備が終わったメソッ ドはnotifyAll()を使って他のメソッドを呼んでいる全てのスレッドにwait()解除を知らせる。
    データ構造の共有の場合、BlockingQueueの派生クラスを使えばコードが簡単になる。
    Threadの替りにThreadPoolを使えば、RunnableやCallableを実装した複数のタスクのキュー制御がさらに簡単になる。
StarAtlasでスレッドを使うとしたら、プラネタリウム表示の際に、バックグラウンドで実時間で星空を再描画する、くらいか。sleepさせて数十秒に1回ほど再計算させるとか。後は太陽系の惑星の動きを加速表示させてみるとか。

ところでこのチュートリアル、今年の4月15日にアップデートされて、J2SE 5.0の機能が取り込まれたのらしいけれど、Firefoxで見るとデモAppletが見えなかったり、CPU負荷が100%まで上昇したりする。JRE 5.0をダウンロードして対応しよう、と思ったら、Mac版が提供されていない。やれやれ。

不具合といえば、このサイトのトップページをWindowsのInternetExplorerで見ると空白になってしまうことが判明。個別の記事のページは見えるので、Templateを変えたせいではないと思うのだけど... ヘルプデスクにメールを出してみた。

2005/10/15

うるう秒の廃止にイギリス王立科学アカデミーが反対

イギリス王立アカデミーがうるう秒の廃止の提案に反対だという話。

RAS STATEMENT ON THE PROPOSED ABOLITION OF LEAP SECONDS

うるう秒の導入は不規則だから、プログラムでは扱いづらい。ITUがうるう秒を廃止する提案を決めたのもおそらくそのあたりが原因かもしれない。そういえば StarAtlasでもうるう秒は考慮していない。StarAtlasが扱う程度の精度であれば問題にはならないけど、GPSなどでは扱いがやっかいで しょうね。

でも、アカデミー側の主張も納得できる。

スマトラ沖の地震で地球の自転速度が変わったことなどを考えると、今後もうるう秒の規則的な実施はできないだろう。天体の運行というものは、あんがい気まぐれなものだ。

2005/10/13

マウスの挙動

StarAtlasでは星図、プラネタリウム、太陽系の三つのモードの表示を切り替えられる。現行バージョンではこのうち星図のモードだけ、マウスでクリックをするとその場所を中心に再描画を行う。

当時のCPUパワーでは星の座標を再計算しての画面再描画にあまり余力がなかった、ということもあるのだけど、新版ではこのマウスの挙動を見直して、様々な操作を行えるようにしたい。

【星図モード】
シングルクリック時:十字カーソルを表示。再度のシングルクリック でトグルする。カーソル点の赤緯赤経の表示、カーソル点を中心とした再描画、最も近い天体の名前表示など。
ダブルクリック時:クリック点を中心に再描画。
ドラッグ時:選択範囲を長方形で表示。onMouseUpで選択範囲へズームイン。
Option+クリック時:直近の正規倍率までズームアウト。
Control+クリック時(右クリック時):ポップアップメニューの表示。
Option+ドラッグ時:画面をスクロール。
ホィール:画面を上下にスクロール。
Option+ホィール:画面を左右にスクロール。
Control+ホィール:拡大縮小。
【プラネタリウムモード】
シングルクリック時:十字カーソルを表示。再度のシングルクリックでトグルする。カーソル点の赤緯赤経の表示、最も近い天体の名前表示など。
ダブルクリック時:
toolkit = Toolkit.getDefaultToolkit();
toolkit.beep();
何もしない。
ドラッグ時:選択範囲を長方形で表示。onMouseUpで選択範囲へズームイン。
Option+クリック時:正規倍率までズームアウト。
Control+クリック時(右クリック時):ポップアップメニューの表示。
Option+ドラッグ時:表示時間をスクロール。
ホィール:上下にスクロール。
Option+ホィール:左右にスクロール。
Control+ホィール:拡大縮小。
【太陽系モード】
シングルクリック時:toolkit.beep(); 何もしない。
ダブルクリック時:toolkit.beep(); 何もしない。
ドラッグ時:選択範囲を長方形で表示。onMouseUpで選択範囲へズームイン。
Option+クリック時:正規倍率までズームアウト。
Control+クリック時(右クリック時):ポップアップメニューの表示。
Option+ドラッグ時:表示時間をスクロール。
ホィール:視点を上下に移動。
Option+ホィール:視点を左右に移動。
Control+ホィール:視点を前後に移動。

2005/10/12

Javaのお勉強

StarAtlasの新版をJavaで書くと決めてはみたものの、プログラミングの現役を離れてからだいぶ経ってしまったので、少しおさらい。「Java入門」でぐぐってみると、こんなページが見つかる。
JDK 5.0は、2004年9月30日に、「Java史上最大の機能強化」を謳ってリリースされました。開発コード名は "Tiger"。
JDKはもう5.0までいってるのか。新しいJDKをダウンロードしようと、Sun Microsystemsのサイトにまで行ってからはたと気づく。そうか、今使っているMacOS Xは、そのままで立派なJava開発環境じゃないか。native2asciiなんてツールまでそのまんまサポートされている! すばらしい。

Appleのサイトに行くと、Xcodeなんていうすばらしい開発環境まで整っている。なんのことはない、.javaの拡張子のファイルをダブルクリックするとXcodeが立ち上がる。いい時代ですねぇ。Apple Developper Connectionの入り口まで行ってから引き返すことにする。もっと詳しい情報が必要になったらまたこよう。とりあえずメモ。

杜甫々さんのサイトに行ってGUIまわりのライブラリをチェック。AWTの他にSwingなんてものがあるらしい。

Swingスィング)は、JDK1.2 でサポートされた AWT よりも新しい GUIコンポーネントです。AWT に対して以下のような特徴があります。

  • OSが変わっても見栄えが変わらない。
  • AWTよりも重い。
  • AWT での部品名に J をつけたものが多い。
JMenuBarTest.javaという、お手ごろなサンプルプログラムがあるので、拾って遊んでみる。GUIのとっかかりとしてはこれがよさそう。Look & FeelがちょっとMacっぽくないのが気にはなるけれど。

... てか、Xcodeで新規プロジェクト作成して"Java Swing Application"を選べば、Macライクなひな形アプリが一発でできるんじゃん。なぁんだ。てか、スティーブ・ジョブスってやっぱり偉大だ。

あとは、
  • パソコンの現在時刻とタイムゾーンの取得
    java.util.Date, java.util.TimeZone
  • パソコンの緯度経度情報の取得
    • 取得できない場合の初期設定
  • 設定情報の読み込み・書き出し
  • スクリーンサイズの取得
    → this.getWidth(), this.getHeight()
    javax.swing.JFrame → java.awt.Component
  • (オプション)フルスクリーンモード
    java.awt.DisplayMode
などについて調べること。

Sunのサイトのチュートリアル
を読んでおくべし。

2005/10/01

はじめに

今見えている星空がどんなふうになっているかを知りたい。
太陽の動きから、建物の影が季節によってどう変化するかを知りたい。
月や土星は今どっちの方向に見えるの?

こんな動機からMacintoshで動作するStarAtlasを開発してからもう12年になる。

子供の頃から天文学が好きで、大学に入って初めて買ったプログラマブル電卓を使って、中野主一さんが4半世紀前に執筆された「マイコン宇宙講座入門」を読みながら、徹夜で万年カレンダーのプログラムを組んだり、彗星の軌道計算のプログラムを組んだりしていた。

Mac 用に書いたStarAtlasは、Motorola 68000を搭載したMacPlusやMacSEでもかろうじて動作する。当時のシステムは 6.0.7 だった。ありがたいことにMacOS Xの時代になっても、Classic環境で動作してくれる。Dog yearといわれる世の中にあって、これだけ長く一つのプログラムが動作するのは驚嘆に値する。Macintosh万歳!

その後、忙しくなってしまったこともあって、プログラムをアップデートしないまますっかり放置してしまった。しかし時代は変わって、MacintoshにもIntelのCPUを搭載したモデルが来年6月には登場してくるらしい。2007年末にはMotorolaのMacの発売が終了するともいう。

ということで、StarAtlasもそろそろ次のプラットフォームに向けて準備しておかなきゃね、でも、自分は天文学のプロでもないし、日曜プログラマだし、ということで、開発のあれやこれやを日誌として残しておくことに決めた。

いろいろ考えて、次の開発は勉強もかねてJavaで行ないたいと思う。と同時に、中野主一さんの本がBasicで書かれているので、Javaの天文計算入門、みたいな話題も扱ってみたい。

と、希望ばかりが膨らむけれど、どこまで手を付けられるものか。まずは気長におつきあいくださいませ。