Archive for 9月, 2004

Flash MX を使ってみたい

土曜日, 9月 25th, 2004

 規模的に小さい仕事ですが、 Macromedia Flash で幼児用教材を開発する仕事をしてます。これがカナリのボリュームで、第一弾は完成したんですが、まだ次々と…。
 今まで Flash5 を使ってたんですが、Flash MX では ActionScript がカナリ変わったということで、使ってみたくなりました。相談したら Flash MX を買ってくださるということで、ちょっと下調べ。

Macromedia Flash テクニカルノート一覧

ActionScript1.0 から ActionScript2.0 へ

  • オブジェクト指向概念になったみたいです。
  •  Javaとあんまり変わらない?クラスが作れるようです。継承やインターフェイスなんかも。大文字と小文字も区別される。

  • 変数に型を指定できるようになりました。
  • 変数の宣言と初期化の例。以下で、数値n, 文字列s, Date型dの変数を宣言・初期化できます。
    var n:Number = 1;
    var s:String = “aaa”;
    var d:Date = new Date();
    以下が関数の記述
    function calc(x:Number, y:Number):void {
    …関数の中身
    }

  • クラス
  • ・コンストラクタ関数を持つことができる
    ・外部ファイルに記述しないといけない
    ・クラス名はファイル名と同じにしないといけない。
    インスタンスを作るにも Java や C++ と同じように宣言する。
    次の例はXXX というクラスを xxx というインスタンス名で作成。コンストラクタは引数を取らない。
    var xxx:XXX = new XXX();
    ・スーパークラスの継承は単一継承
    ・修飾子は public, private, static が使用可能

    Javaっぽい。Flash は画像とか、ムービーとかのインスタンスが絡んでくるし、時事系列でプログラムの流れを制御しないといけない所とかが難しいんですが…。



    クリーンルーム

    火曜日, 9月 14th, 2004

     今日はシステムを本番サーバーに移行し、テスト公開開始でした。動作確認をするためにクリーンルームに初入室です。マスクで息苦しい。4時間立ちっぱなしだったので、普段、デスクワークの私には辛い一日でした。運動不足です。
     サーバーの IP を間違っててちょっと慌てましたが、現場の担当の方から、「最近のシステムの中で、一番出来が良いです。」とお褒めの言葉を頂きました!こういうとき、開発してて良かった、と感じるときです。
     あと、詳しくは書けませんが、いろんな機械が動いてて、楽しかったです。



    JNLPファイルについて

    金曜日, 9月 10th, 2004

     プロ野球、ストライキ回避!ということはさておき。
    Java Web Start でクライアント側にアプリケーションを呼び出す場合、JNLPファイルというのを作らないといけない。
    詳しいことは Java TM Web Start 開発者ガイド Ver.1.2 を参照のこと。
    以下のようにindex.jnlpというファイルを作成する。

    XML:
    1. &lt;?xml version="1.0" encoding="Shift_JIS"?&gt; <!-- (1) -->
    2. <jnlp spec="1.0+" codebase="http://localhost:8080/swttest/"><!-- (2) --></jnlp>
    3.  
    4. <information>
    5. <!-- (3) -->
    6. <vendor>提供者</vendor> <!-- (4) -->
    7. <offline>
    8. </offline></information>
    9.  
    10. <resources>
    11. <j2se version="1.4">
    12. <jar><!-- (5) -->
    13. <nativelib><!-- (6) -->
    14. </nativelib></jar></j2se></resources>
    15.  
    16. <resources os="Windows">
    17. <jar>
    18. </jar><!-- (7) -->
    19. <application main-class="xxx.yyy.hello"></application> <!-- (8) -->
    20. </resources>

    (1) ここを日本語にしないとスタート時のダイアログに日本語文字を表示しようとすると文字化けする。
    (2) codebaseはWebサーバーに配置したサービスのURL。基本的にWebアプリケーションの配置の仕方と同じ。localhostにしとくと、クライアント自身のlocalhostを見に行こうとするので、本番環境に移行した際にブラウザのエラーになるミスをよくやる。
    (3) アプリケーションのスタート時ダイアログに表示される。
    (4) これも。
    (5) JVM起動時にクラスパスとして指定するJarファイル名。
    (6) ネイティブライブラリ(Windowsでは*.dll, Linuxでは*.soとか)のロードを行うJarファイルの指定。
    (7) OSによって、使うJarを使い分けできる。これはSWTのWidows用Jar。
    (8) 起動するメインクラスのパッケージ+クラス名を指定。

    作成したindex.jnlpをWebアプリの配置ルールにしたがって、Webアプリケーションのベースフォルダ(jspとかhtmlファイルを置くフォルダか、それ以下)に配置して、httpでアクセスしてみる。起動用リンクなどを作ると良い。このとき、もちろんクライアント側には Java Web Start がインストールされていないといけない。



    スレッドの必要性

    木曜日, 9月 9th, 2004

    org.eclipse.swt.SWTException: Invalid thread access
    という、見たこと無い例外が発生。SWTでクライアントアプリを作成している途中です。何をしていたか、というと、ひとつのShell(ウィンドウ)を開いて、ボタンを押したときのイベントリスナから他のShellを呼び出す、という動作。
    Eclipseでデバック実行しているときは、Exceptionがでないんですが、WebStartから実行すると、二つ目のShellを表示する前にorg.eclipse.swt.SWTException: Invalid thread accessという例外がでました。
    SWTは資源の競合が起こらないように、ウィジェットの操作を別スレッドから行うことを禁止しているそうです。
    呼び出すShellの実行を他スレッドで実行しないといけないらしく。二つ目のShellを実行するクラスにRunnableをimplementsして、run() メソッドを実装しないといけないらしい。そして、run() メソッドは start() メソッドから呼び出す。
    サンプルを作ってみた。これだとWebStartからの起動時も例外が出なかった。

    JAVA:
    1. /**
    2. *呼び出される側
    3. */
    4. class XXXX implements Runnable {  // Runnableをimplementsする
    5. private final Shell shell;// Shell
    6. public XXXX() {//コンストラクタ
    7. // 自作メソッドopen()をコール
    8. open();
    9. }
    10. public void open() {
    11. checkAsyncExec(new Runnable() {
    12. public void run() {
    13.    …Shellの初期化などをする
    14. // Shellを開く
    15. shell.open();
    16. }
    17. }
    18.  
    19. // Displayが生きてるか死んでるかのチェック
    20. private boolean checkAsyncExec(Runnable r) {
    21. if (!display.isDisposed()) {
    22. display.asyncExec(r);
    23. return true;
    24. } else {
    25. return false;
    26. }
    27. }
    28. }
    29.  
    30. /**
    31. *呼び出す側
    32. */
    33. class YYYY {
    34. private final Shell shell;// Shell
    35. public YYYY () {//コンストラクタ
    36. // シェルの生成
    37. Shell = new Shell(display, SWT.TITLE);
    38. Button buttonY;
    39. }
    40.  
    41. /**
    42. * メイン関数
    43. */
    44. public static void main(String[] strArgs) {
    45. Display display = new Display();
    46. YYY YFace = new YYY(display);
    47. // ログイン画面を開く
    48. YFace .open();
    49. // ウインドウが閉じるまでメインスレッドを終了しない
    50. while (!isAllShellsDesposed(display)) {
    51. if (!display.readAndDispatch()) {
    52. display.sleep();
    53. }
    54. }
    55. // 破棄処理
    56. display.dispose();
    57. }
    58.  
    59. open(){
    60. ・・・Shellの初期化など。
    61. }
    62.  
    63. /**
    64. * 表示されているすべてのShellが破棄されるまでFalseを返す
    65. * @param display
    66. * @return
    67. */
    68. private static boolean isAllShellsDesposed(Display display) {
    69. Shell[] shells = display.getShells();
    70. for (int i = 0; i &lt;shells.length; i++) {
    71. if(!shells[i].isDisposed()){
    72. return false;
    73. }
    74. }
    75. return true;
    76. }
    77.  
    78. /**
    79. * イベントリスナの設定
    80. */
    81. setEventListeners() {
    82. buttonY.addSelectionListener(new SelectionAdapter() {
    83. new Thread(new XXX(shell.getDisplay()).start();
    84. }
    85. });



    Java Web Start

    火曜日, 9月 7th, 2004

     swtを利用してアプリを作るからには Java Web Start を利用してみたいと思いました。というわけで、プロトタイプを作ってお客さんに提案してみたところ、「これで行きましょう!」ということに。
     今までWebアプリケーション以外、殆ど経験無いですし、周りに開発経験のある人がいないので、少し不安ですが、なんとかなるでしょう。できなかったらバッチかEXEを配布する、という妥協案も受け入れてもらえたし。
     こういう、好きな技術を提案できる仕事は良いです。好きです。



    JDBCドライバについてメモ2

    月曜日, 9月 6th, 2004

    先日の「JDBCドライバについてメモ」の訂正。

    JDBCドライバの接続の際は
    jdbc:oracle:thin:@サーバー名、またはIP:1521:ORCL
    とURLを指定するけど、SID名であるORCLはサーバーのSIDを探しに行くらしい。
    ojdbc14.jarというドライバを使用しているが、このドライバはクライアントにOracleクライアントが入って無くても、接続可能だということ。

    じゃ、問題解決です。



    swtリッチクライアント

    土曜日, 9月 4th, 2004

    久々に早く寝たので、夜中の二時に目が覚めてしまった…。JUGEMが復旧してるみたいなので、今回の仕事のまとめを。これからこういう仕事増えると面白い。

    今回のお題

  • JavaでWidnowsGUIのようなアプリを実現する
  • 再配布が楽なリッチクライアント技術を試みる
  • 懸念事項

  • クライアントマシンに Oracle Client が入って無くても動作するか
  • :→他は試してないが、ojdbc14.jarは接続できる。

  • Oracle だけでなく、その他パッケージソフトで動作するサービスに接続できるか
  • :→結果、できる。

  • バッチファイルで起動するのは何か嫌。
  • →:実は Project Amateras で Boot Java というツールが公開されてます。Javaアプリをexeから起動できる。iniファイルにメイン関数を持ったクラスとか、起動時に必要なパラメータ、クラスパスとかを記述できる。

    提案事項

  • Appletは見栄えが悪いので、swtを提案
  • クライアント配布用に Java Web Start を提案
  • 主な予想外の自体

  • 避けては通れないと思っていたが、スレッドを勉強するきっかけになった
  • war ファイルを作成するのに手間取った。自己署名証明書の作成など。あと、jarファイル作成時、プロパティファイルの "Duprication Entry" 圧縮時の例外でかなり時間を食ってしまった。Eclipse でデバック実行時にはclassesの下にプロパティファイルが無いと MissingResourceException が発生するのだが、圧縮する際は Classes フォルダの下のプロパティファイルは削除して圧縮。それでも、リソースとかはちゃんと表示される。不思議。というか、これらの処理をAnt 記述で行ったのだが、Ant 自体を良く理解できてない。
  • Eclipseのデバック起動時には何事も無く動作しても、デプロイして Java Web Start から動かしてみると、スレッド処理時の例外とかがポコポコでてくる。難しい。
  • 「何か動かんなぁ?」と思ったら、データベースサーバーの名前が解決できてなかったりした。本番環境で動かしてみるときは、DNS とか、サーバーのプロキシ設定とかをセットアップ手順に加えたほうが良い。