2008年4月アーカイブ

今回は、MouseEventについて

1.描画領域全体に対するマウスイベント
2.3Dオブジェクトに対するマウスイベント
の2つを考える。

特に後者はPapervison3Dの1.5から仕様変更があったので、そこのポイントを押さえる。

実際にやってみるのは、
1.画面上でマウスをドラッグするとCubeを回転
2.マウスオーバーすると拡大、マウスアウトすると元に戻す









ソース(myMouseEvent.mxml




1.画面をドラッグするとCubeを回転
・イベント自体はPapervision3D特有のものでもなんでもなく、フツーのFlexのイベント
なので、thisにaddEventListenerするだけでマウスイベント自体は取れる



・イベントの内容は自体は、マウスが押されているかどうかを保持するisMouseDown:Booleanと、ドラッグした距離に比例して素早く回転させたいのでドラッグの始点となる座標を保持だけ


・実際の回転は、36行目でaddEventListerされたENTER_FLRAMEつまり毎フレーム呼ばれる関数内に書けばいい



2.マウスオーバー ・これはPapervision3dのEventで、1.5ではSceneはInteractiveScene3Dを使わなければならなかったり、MovieScene3Dでオブジェクトをその直下に配置しなければならないなどメンドクサイことがいっぱいあったけど、GreateWhiteではScene系のクラスはScene3Dのみになっている。
なので、マウスという2次元の座標に対し、3D次元空間にあるObjectのEventの為に計算を頑張るかは、それぞれのinteractiveというプロパティがtrueになっているかによって決まる。
まず、ViewPort3Dのインスタンスのinteractiveプロパティをtrueにする。コンストラクタでいうと4番目の引数がそれであるので、trueにする。



・次にCubeのオブジェクトにイベントを付けたいので、こいつのMaterialのinteractiveプロパティもtrueにしとく。(何でもかんでもtrueにすると重くなるので、使うやつだけにする)


・最後にaddEventListerして終わり。



以上メモ終わり

1.5から仕様変更が起こったので、基本的なPrimitiveObjectを表示するだけのソースを作成。


ポイントをメモ。







ソース(PrimitiveObject.mxml




svnソースは、http://papervision3d.googlecode.com/svn/trunk/のbranches/GreatWhite/src/にあるので、ビルドパスに追加



・Viewport3Dには、描画を計算するサイズを指定。mx:applicationと同じにしとけばとりあえず無駄は無い


・カメラはFreeCameraを使うと、カメラを移動させたり回転させたりできる。


・オブジェクトはSceneに直接addChildせずに、rootNodeを作って用途ごとに階層化すれば、rootNodeごと移動とか回転とかできる。


・BitmapFileMaterialで画像のマテリアルを作れる。doubleSidedで裏から見ても描画される


・カメラはFreeCameraを使うと、カメラを移動させたり回転させたりできる。


・Cubeは6面持っているので、MaterialListに1つずつ貼る。別にBitmapFIleMaterial以外のMaterialを使ってもいい。frontや、backとか以外にもallがある。


・ColorMaterialも使ってみた。他にもMovieMaterialやWireframeMaterialなどがある。 Interractive~MaterialやPrecise~Materialは、廃止され、propertyでtrueすればいい


・eventLisnerに追加してあるので、毎フレーム自動的よばれて描画してくれる。 とりあえず、回転を3種類の方法でやってみた。



以上メモ終わり

Windowsマシンから、同じくWindowsのファイルサーバにjava.io.Fileでアクセスすると、
Javaプログラムが走っているマシンにログインさせたユーザの権限で共有ファイルにアクセスする。

つまり、
ファイルサーバにAとBというディレクトリがあり、aさんでログインしたマシンではディレクトリAにアクセスでき、bさんでログインしたマシンからではディレクトリBにアクセスできるとする。

このとき、aさんでログインしたマシン上で動いてるJavaからはjava.io.FileでAにはアクセスできる。
ここで、aさんでログインした状態で、ディレクトリBにアクセスする方法のメモ



まず、java.io.Fileには認証機能が存在しないので、JCIFS(The Java CIFS Client Library)というライブラリをダウンロードし、クラスパスを通す必要がある。

jcifs.smb.SmbFileやjcifs.smb.SmbFileInputStreamなどは、java.io.Fileやjava.io.FileInputStreamと同じように扱える。


ここで、認証の仕方が2種類見つかったので、2つとも¢(. .。)メモメモ

<条件>
ディレクトリBのpath:¥¥fileserver¥B
fileserverのIP:192.168.0.1
bのユーザー名:hoge
bのパスワード:foo
   +
上の例の条件


<方法①>


以上(笑)

これ以降は、jcifs.smb.SmbFileを使って、java.io.Fileと同じように、ディレクトリ内のファイルのリスト(SmbFile配列)を取得したり、ファイル名とかファイルサイズを取得したりする。

ちなみに、アクセス権の内ディレクトリにアクセスしようとすると、Exceptionが投げられる
また、SmbFileを使ってユーザbを認証している間は、SmbFileではAにアクセスできない。Fileではできる。

<方法②>
jcifs.smb.SmbFileの他にjcifs.Configを使って




<参考>
java:jcifs [Paulownia.jp]
試験管のなかのコード :: JCIFSにチャレンジ

タイトル通りBlazeDSでFlexとJavaを通信させる最小限の設定(だと思う)

~Java側の設定~
①まず、AdobeのBlazeDSのページからライブラリをダウンロード

②これを展開し、以下の4つをjavaのWEB-INF/libにつっこむ
・backport-util-concurrent.jar
・flex-messaging-common.jar
・flex-messaging-core.jar
・flex-messaging-remoting.jar

③Blaze用の設定ファイルをWEB-INF/flex/services-config.xmlに作成
メモ:flexっていうフォルダは自分で作る!!

説明のため、hogeパッケージのFooクラスにflexからアクセスする為のメソッドを起き、
名前を、hogehogeと名づけ、http://www.example.com/BlazeTest/
でアクセスすると仮定すると、(blazeTestはTomcatで設定)

内容は、


ここで重要なのは15行目と19行目だけ

15行目のは、flex側の設定で出てくる。
19行目のは、flexから呼ばれるJavaクラスを登録する。Java Beansって書いてあるけど、呼び出したいメソッドのJavaクラスのことだと思う。HttpServletを継承する必要はない。
引数、戻り値に使うJavaBeansはここで登録しなくてもいけた。


④実際に呼びだされるJavaクラスの作成。
先ほど登録したクラスを作成。
引数、戻り値がある場合は、flex側とjava側の両方に全く同じフィールドとそのgetter,setterメソッドしか持たないBeanクラスを作る必要がある。Java側はフツーのJavaBeansで良い。ちなみに戻り値に使うクラスはSerializableをimplementsしていなければならない。

説明のため、barメソッドを呼び出すとする



⑤④の設定ファイルを読み込むようにweb.xmlに追加
WEB-INF/web.xmlに以下の内容を追加する。




~Flex側での設定~
①mxmlにdestinationを指定
mxml内にremoteObjectを書く

ここでlocalhost:8080は自分の環境に合わせて変更し、destinationはJava側で設定した↑の15行目の文字列が入る。

②通信開始を呼ぶメソッドを書く
ASのfunction内でもmxmlのclickとかchangeでもいいけど、そこで
srv.bar()と書けば通信してくれる。引数がある場合はもちろんここにいれる。
戻り値は、srv.bar.lastResultで取得できるが、この通信は非同期で行われるので、ASのfuncrion内でこのメソッドを呼んでも、通信が終わる前に次の行が処理されてしまうので注意。

受信が完了した時に、barResultというfunctionを呼んで処理をしたい場合は、①のRemoteObjectを以下のように変更する。

nameには、java側の呼び出すメソッド名、resultには、受信後にflex側で呼び出すfunctionを指定してやる。

③Flex側でもBeansを作成
通信で扱う変数は、Beanに格納しなければならない。(ただし、戻り値のStringの場合は必要ない)
また、FlexとJava側で作成したBeansを関連関連付けるため、AS側のBeanクラスのpublic classの前の行に
[RemoteClass(alias="hoge.FooBeans")]などとJavaBeansのパッケージ名を含んでクラスを教えてあげなければならない。
戻り値に使う場合はもちろん[Bindable]も必要




たぶん、これでいくはず


<参考>
Adobe - Developer Center
Adobe BlazeDSを自分のWebアプリケーションに組み込む設定
前回の[Linux]FedoraにTomcat6をインストールするの状態では、port8080でしかtomcatにアクセスできないので、80番portでもアクセスできるようにする。


連携に使うModuleは、mod_proxy.soとmod_proxy_ajp.soであるが、デフォルトで入っていたけど、/etc/httpd/modulesに入っているか一応確認。

次に、今回はhttp://www.example.jp/tomcat/にアクセスがあったとき、Tomcatをたたくように設定する。apacheの設定ファイルに以下の行を追加するだけ
# vim /etc/httpd/conf/httpd.conf
<Location /tomcat/>
ProxyPass ajp://localhost:8009/
</Location>
<参考>
Tomcat 6の実力を早速試す - 移行するべき? その時期は?
"安全"のためにTomcatを理解し、構築し、動作させる
再インストールするときのためのメモ

Tomcatの公式ホームページに行ってTomcat6.0.Xをダウンロード

shellでやるなら、
# cd /tmp
# wget http://ftp.riken.jp/net/apache/tomcat/tomcat-6/v6.X.X/bin/apache-tomcat-6.X.X.tar.gz
# tar -xzf apache-tomcat-6.X.X.tar.gz

展開したファイルを、/optに移動
#  mv -f apache-tomcat-6.X.X /opt/tomcat6

ここでtomcat専用ユーザを作成し、/opt/tomcat6 の所有権を与える
# useradd -d /opt/tomcat6 -s /sbin/nologin tomcat
# chown -R tomcat. /opt/tomcat6


tomcat用のユーザが作成出来たら、次にtomcatをデーモン化する。
デーモンのscriptはtomcatの中のbinに入っているjsvc.tar.gzであるので、いったん/tmpに移動し、解凍後makeする。
# mv -f /opt/tomcat6/bin/jsvc.tar.gz /tmp/
# cd /tmp
# tar -xzf jsvc.tar.gz
# cd jsvc-src
# autoconf 
# ./configure
# make
# chown tomcat. jsvc
# mv -f jsvc /opt/tomcat6/bin
# rm -rf /tmp/jsvc-src/ /tmp/jsvc.tar.gz


デーモン化できたら、serviceで起動や停止ができるようにする。
/etc/rc.d/init.d/にjsvcというファイルを作成し、内容を次のようにする。
# vim /etc/rc.d/init.d/jsvc
#!/bin/sh
#
# chkconfig: - 80 20
# description: jsvc

# Source function library.
. /etc/init.d/functions

JAVA_HOME=/usr/java/jdk1.5.0_12
CATALINA_HOME=/opt/tomcat6
TOMCAT_USER=tomcat
TMP_DIR=/tmp
CATALINA_OPTS=
CLASSPATH=\
$JAVA_HOME/lib/tools.jar:\
$CATALINA_HOME/bin/commons-daemon.jar:\
$CATALINA_HOME/bin/bootstrap.jar
PIDFILE=/var/run/tomcat.pid
LOCKFILE=/var/lock/subsys/tomcat
DAEMON=$CATALINA_HOME/bin/jsvc

start(){
    #
    # Start Tomcat
    #

    echo -n "Starting jsvc: "
    $DAEMON \
    -pidfile $PIDFILE \
    -user $TOMCAT_USER \
    -home $JAVA_HOME \
    -Dcatalina.home=$CATALINA_HOME \
    -Djava.io.tmpdir=$TMP_DIR \
    -outfile $CATALINA_HOME/logs/catalina.out \
    -errfile '&1' \
    $CATALINA_OPTS \
    -cp $CLASSPATH \
    org.apache.catalina.startup.Bootstrap

    #
    # To get a verbose JVM
    #-verbose \
    # To get a debug of jsvc.
    #-debug \
    RETVAL=$?
    if [ $RETVAL = 0 ]; then
        echo_success
        touch $LOCKFILE
    else
        echo_failure
    fi
    echo
}

stop(){
    #
    # Stop Tomcat
    #
    echo -n "Shutting down jsvc: "
    $DAEMON \
    -stop \
    -pidfile $PIDFILE \
    org.apache.catalina.startup.Bootstrap
    RETVAL=$?
    if [ $RETVAL = 0 ]; then
        echo_success
        rm -f $PIDFILE $LOCKFILE
    else
        echo_failure
    fi
    echo
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    status)
        status $DAEMON
        RETVAL=$?
        ;;
    *)
        echo $"Usage: jsvc {start|stop|restart|status}"
        exit 1
        ;;
esac
スクリプトを作成したら、実行できるよう権限を付与する。
# chmod +x /etc/init.d/jsvc
最後に、Linux起動時に自動でTomcatが起動するように設定
# chkconfig jsvc on

iKnow

あわせて読みたいブログパーツ
Firefox meter