2009年1月21日 (水)

[技術ネタ] Java JOGL(OpenGL)でのエラーについて(覚書)

久々に技術ネタで失礼いたします。

~・~・~

Java+JOGLを使っていて、

javax.media.opengl.GLException: Error making context current: 6

とか

javax.media.opengl.GLException: Context not current on current thread

というようなエラーが発生して困った場合は、

 

AWT/Swingのイベント処理スレッド(Event Dispatch Thread = EDT)で、例外を catch し忘れた場合にEDTは一旦破棄され、新たに別のスレッドがEDTとして動きだし殆ど場合復帰しますが、JOGLは元のEDTと紐づけされて動いているため上記のエラーが発生するようです。

上記の例外が発生した場合、OpenGL周りの処理を再度初期化してあげれば復活するようです。

もともと例外を発生させない&例外を取りこぼさないのが最善ではあるわけですが。。

1月 21, 2009 Java | | コメント (2) | トラックバック (0)

2008年3月28日 (金)

Java から ActionScript3 に変換

先日公開した、JavaからActionScript3へのソースコード変換ソフト「Java To ActionScript3 Converter」を使って変換した結果を、手作業で最終的に変換するために必要なよくある作業を書き留めておきます。
※この記事は随時更新していきます。

■オーバーロードをまとめる(同名のメソッドを一つに合体する)

Javaは同じ名前のメソッドを複数持てますが、AS3では同じ名前のメソッドおよびコンストラクタを持てません。
代わりにAS3では、引数にデフォルト値を持たせることができるので、Javaの複数メソッドを一つにまとめることが可能です。

・コンストラクタを、うまく1つにできない場合は「public static function createA( 引数 ):A 」というスタティックメソッドにするなどの方法が考えられます。

・メソッドを、1つにできない場合は「getXxx() , getXxxAt()」のように名前を変えるなどの方法が考えられます。


■スコープごとに定義された同名の変数を...

Javaでは、スコープごとに変数を定義できますが、AS3ではスコープ内に定義した変数もメソッド全体で参照できてしまいます。このため、AS3では「変数定義が重複している」という警告になります。

//Javaの場合
 for( 略 ){ int t = 0 ; }
 for( 略 ){ int t = 0 ; }//もう一度 t を使っても Java では問題なし

 //ActionScript3の場合
 for( 略 ){ var t:int = 0 ; }
 for( 略 ){ var t:int = 0 ; }//ActionScript3では、重複定義という警告になる

この警告は放置しても直接的な問題はありませんが(*1)、私は念のためそろぞれの変数名を手作業で変えて使っています。

*1. ActionScript3では、メソッド内で再度同じ変数を定義しても、前の変数が使いまわされるため予期せぬ動作になりえる可能性がありますが、Javaから移植した場合、ローカル変数は参照前に値が初期化されていないとエラーになるため、使用前に毎回値がリセットされているはずです。しかし、やはり別の変数を再定義する方が無難だと思われます。


■メソッドオーバーライド

オーバーライドするときは、サブクラス側のメソッドに override をつける。

  public override function someMethod( ) : void {


■staticの初期化

Javaの static{ 初期化処理.. } による初期化は、ActionScript3では、初期化処理..をクラス内のメソッドの外に直に記述すればよい模様。※この部分は次回バージョンアップで対応予定

  public class A {
    trace("ここに初期化を直に書ける") ;

  }


(随時更新予定)

3月 28, 2008 ActionScript, Java | | コメント (0) | トラックバック (0)

2008年3月20日 (木)

JavaからActionScript3への変換ツール公開

先月、Live2DをFlashに移植しはじめて半日ほどたった時点で、文法の細々とした違いに発狂しそうになり勢いあまって作ったソースコードのコンバータです。

ライブラリ等は一切変換しませんので、自力でなんとかしていただく必要があります。

パッケージ、メソッド宣言、変数宣言、キャストなどの文法の違いについては、ほぼ問題なく変換できます。

~・~・~・~

思い突きから配備まで延べ3日で作ったシロモノですので、過度の期待はクレグレも禁物です!!

では、良かったら使ってみてください。

http://www.piclet.jp/a_j2as3/

さあ!Java&Flash好きなあなた!
Silverlightの追撃をかわすためにガンガン移植していきましょう!

※あまり眠ていないので、ハイテンションになってしまいました。

3月 20, 2008 ActionScript, Java | | コメント (0) | トラックバック (0)

2007年7月 6日 (金)

GIF画像、GIFアニメをキレイにするツール公開

数日前から訳あってGIFの書き出しライブラリを自作していました。

で、おまけでGIF画像をスムージングするツールを作って公開しました。

http://www.piclet.jp/


変換前

変換後

出来立てのGIF(LZW)書き出しなので、少し不安はありますが。。一応動いているようです。

7月 6, 2007 Java, JavaWebStart普及委員会 | | コメント (2) | トラックバック (0)

2007年6月16日 (土)

JOGLを始める前に

JavaからOpenGLを使う仕組みJOGL(Java bindings for OpenGL)。

JOGL以前に、OpenGLも初心者な私は、独学で勉強するにあたって、まず JOGLの本を探したが日本語版は出ていない。結局高くて読めない英語版を購入してしまった。

しかし、いざ実装し始めてみると、JOGLの専門書など全く要らないことが判明。。

JOGLは純粋にOpenGL関数への橋渡しをするだけであり、Javaの癖はチラホラとしか出てこない。。

そんなわけで、OpenGLの本だけ買って、後はWEBで調べれば事足りてしまう。。。

・・・

OpenGLの専門書は、入門書数冊と、本格的なプログラミングガイド、リファレンスが一冊ずつしかない様子。

OpenGLの入門書はWEBでも何とか代わりがきくが、本格的にJOGL/OpenGLをやるなら「OpenGLプログラミングガイド」は欠かせない一冊。13,000円もしたが、この価格帯の本では近年珍しく大満足の内容。

6月 16, 2007 Java, OpenGL/JOGL | | コメント (2) | トラックバック (0)

2007年6月14日 (木)

JOGL / 自分と誰かのための覚書

Java+JOGL (Java bindings for OpenGL) で開発する人のための覚書①

■DebugGLを使う

パフォーマンスについてはある程度おちると思われる ( 一目で分かるほどの違いは無いです )が、JOGL初心者のうちは GL を DebugGL でラップして使った方が良い気配。

GLのまま使っている時に、未対応の処理を呼び出すと、何も言わずにJavaが落ちる場合が確認される。DebugGLでラップすると、少なくとも落ちることは無くなり、例外を出すようになる。

開発時にこの状況を試すには、WindowsXPの場合、モニタの詳細設定でハードウェアアクセラレータを「なし」にする。すると、JOGLから使われるOpenGLのバージョンが1.1(私の2台の場合)になるので、落ちる状況を試すことが可能となる。
※もっと良い方法があるかもしれませんのであしからず。

ちなみに、「TraceGL」でラップしてやると、処理のたびにOpenGLのコマンドをダンプしてくれるので、これまたデバッグには重宝する。


(・・・中途半端ですが、眠いので、とりあえずこのあたりで失礼します・・・)

6月 14, 2007 Java, OpenGL/JOGL | | コメント (0) | トラックバック (0)

2007年5月14日 (月)

立体ロゴの作成ツールを公開しました。

3月中旬から独学で3D (OpenGL) を勉強し始め、せっかくなので何か作ろうと思い立体的なロゴを作成するツール『Piclet Logo 3D』を作成し、公開しました。

適当に作って、適当にアップしようと思ったものの、凝り出してしまい、きりが無いのでとにかく出すことして、先ほど公開しました。

JavaでOpenGLを使う仕組み「JOGL (Java bindings for OpenGL)」を使って作っています。動かすためにはJava5が必要です。

http://www.piclet.jp/a_logo3d/

■デモムービー





5月 14, 2007 Java, JavaWebStart普及委員会, OpenGL/JOGL | | コメント (10) | トラックバック (0)

2007年2月18日 (日)

圧縮されたSWFの書き出し

Flash SWF書き出しの覚書4

SWFではバージョン6以降で圧縮をサポートした模様。

SWFバージョン8の仕様書p.17に軽く説明があるだけだが、ZLIBを使って圧縮すべしとのこと。

ポイントは

・ファイルの頭に書き出す3バイトのシグニチャをFWS(非圧縮)からCWS(圧縮あり)にかえる
・ヘッダ部のFileLengthは、『圧縮前のファイルサイズ』を書き込む
・FileLengthの直後(先頭から8バイト目移行)から圧縮する


さっそくJavaで実装してみた。
最初に試した標準ライブラリのGZIPOutputStreamではうまくいかないが、同じく標準ライブラリのjava.util.zip.DeflaterOutputStreamで書き出してみたところ無事FlashPlayerで再生が可能になった。

恐ろしくサックリ動いたがこれで良いのかな?恐るべしJavaの標準ライブラリ。

2月 18, 2007 Java, SWF書き出し | | コメント (0) | トラックバック (0)

2007年2月14日 (水)

3次のベジェから2次のベジェ(B-Spline)に変換

FlashのSWF書き出しの覚書2

FlashのSWFでは3次のベジェが使えないため、表題のごとく

 3次のベジェから2次のベジェ(B-Spline)に変換

する必要があります。

で、WEBを探したのですが正しい方法が見つからず、ひとまず適当な変換を大急ぎ(約1時間)で実装し、やれやれと思ってたところ。。。ふとSWFの仕様書をよく読んだら、変換の仕方について書いてありました
(T_T)

詳しくはこちらをご覧下さい(英語です)
http://steve.hollasch.net/cgindex/curves/cbez-quadspline.html

大まかに説明すると、
1.3次のベジェC1の2本のコントロールの交点を2次のベジェのコントロールとして曲線C2を作る。
2.C2が、元の曲線C1を十分に近似できているか評価する
3.近似できていない場合は、元のC1をさらに二つに分割して、それぞれを再帰的に1の処理に当てはめる

というようなところでしょうか。評価の方式としては、C1の中点と、C2の中点の距離をチェックする方式を推奨しているようです。


私の実装は、面倒なので自動で2分割してました(ある問題があった時だけ再帰的に分割しています)
惜しいのですが、必要以上に点数が増えるので、改めて実装しなおそうと思います。


■追記
http://developer.apple.com/textfonts/TTRefMan/RM08/appendixE.html
にはもっとはるかに詳しく書いてありました

~・~・~・~・

ちなみに2次から3次の数学的に正しく変換できるようです。
SWFの仕様書によると、2次のコントロールポイントを2/3の長さに切って二つに分ければ、良いだけのようです。

2月 14, 2007 Java, SWF書き出し | | コメント (0) | トラックバック (0)

Flash SWFの書き出し(覚書)

ここ二日ほど訳あってJavaでSWF(Flash)を書き出すプログラムを書いています。

ほいで、誰のためとも無く覚書程度に書いておきます。

...

■SWFファイルフォーマット仕様書の取得

 SWFの仕様書(英語版)は全てAdobeから無料で提供されています(2007/2/14現在)

http://www.adobe.com/licensing/developer/

 Macromedia Flash (SWF) and Flash Video (FLV) File Format Specification (Version 8)

の中の

 Begin the licensing process for the File Format Specification .

 という部分をクリックして、登録すればダウンロードが可能となります。

 PDFで300ページ近くありますが、本気で作る気であれば印刷した方が良いでしょう。

 私はホッチキスで小分けにして閉じて、その都度、必要な部分だけをペラペラ見るようにしています。


■ByteとBit演算のユーティリティを準備

 まず、この手の書き出し処理でお約束の「リトルエンディアン」が出てきます。基本的に1バイト以上のデータ(32bit int型など)はリトルエンディアンで書き出すようです。
リトルエンディアンはそこらで説明されているのでそちらを参考にしてください。

 次はBit演算、フラグとして1bitを書き出したり、4bitや15bitなど任意のビット数で、数値を書き出せる必要があります。

 仕様書にはTYPEとして色々出てきますが大まかに紹介すると

 UI8 なら Unsigned Int 8 (bit) 負号なしINT
 SI16 なら Signed Int 16(bit) 負号付きINT

 UB[1]なら 負号なしのフラグ 0,1
 UB[4]なら 4ビットで表現される負号なしの数値(0~15)
 SB[5]なら 5ビットで表現される負号ありの数値(-16~15かな?)


□負号なしと負号付き

 UB[2]、SB[5]などのとき、Javaであれば >>> と >> をうまく使い分ければ簡単に実装できます。もちろん & , | <<などのビット演算はフル活用しますが。


□その他の型

 RECTなどの型が多々出てきます。

 SWFの仕様を全部カバーするつもりでなければ、あらかじめ全部実装しても殆ど無駄になりますので、必要になったら実装していった方が良いでしょう。


□Byte Align

 UI8などのTYPEは Byte Align(1バイトの境界で必ず分ける)しますが、UB[1]などの場合は、ビットをつなげて行きます。

 SWFのタグはUI16で始まるのでByteAlignされますが、曲線などを定義するShape RecordsはUB[n],SB[n]などのビット書き出しが続くため、次のShape Recordsにいく時もByte Alignされません。私はここでこけました。


■SWFTOOLSを取得

 SWFTOOLSの中のSWFDUMPというソフトを使うとSWFを書き出したあと、Flashなどを使わずに内容をチェックすることが出来ます。
http://www.swftools.org/


■書き出しサンプルの用意

 SWF書き出しの第一目標は、超簡単なSWFファイルを生成して目標どおりに動くかどうかを試すことではないでしょうか。しかし、意外に何を書き出したらよいか悩みます(悩みました)。一発目ではなかなか動かず、どこがいけないのか原因不明になります(数時間苦しみました)。

 仕様書を一生懸命読んでも解決の糸口が見つからず苦しんでいたところ、「もしや」と思い、仕様書の最後を見たら「A Simple Macromdeia Flash(SWF)File Dissected」なるおまけを発見。

 ここには非常にシンプルなSWFフォーマットのサンプルデータとその16進ダンプが書かれております。また1Byteずつどうしてそうなるのかを書いてあるため、これの通りに書き出すことを最初の目標にすると、ドツボにはまることが無くなるのではないでしょうか。

※これに気づかなかったら数日無駄にしていたかもしれません。


□FillStyle0/1

 FillStyle0を使うとFlash8上に読み込み(インポート)した時、理由は今のところ理解していませんが「塗り」が消えてしまいます(FlashPlayerでは見える場合もあります)。FillStyle1を使うとFlash上でもみえます。

2007/02/19 追記

曲線の進行方向の左側を塗る場合にFillStyle0、右側を塗る場合にFillStyle1を使うらしい(SWF8仕様書p.147)。

但し、FlashPlayerではFillStyle0/1の違いが表示に影響を与えていないように思われる。

一方で、Flash8に読み込んだ場合は、Fill Style 0/1の意味を厳密に区別しているようで、正しく左右を指定してないと表示が壊れてしまう。上記のFillStyle1で成功したのは、たまたま曲線の進行方向と一致したようです。

曲線の回転方向を意識して作り直します。。

□曲線

 Flashでは意外にも、2次のベジェ曲線?(B-スプライン?コントロールポイント1つのヤツ)しか対応していません。Illustratorのような3次のベジェ(コントロールポイント2つ)で出来たデータはうまいこと2次のベジェに変換して書き出す必要があるようです。


■あとは根性?

 最低限のSWFが問題なく書き出せたら、後は必要な機能をガンガン組み込んでいくだけではないでしょうか。
画像処理が分かっていて、英語がソコソコ読めて、ビット演算に慣れていれば、一週間でそれなりのSWFを書き出せるようになると思います。もちろん仕様をフルにカバーするのは死ぬほど大変でしょうが。。

2月 14, 2007 Java, SWF書き出し | | コメント (0) | トラックバック (0)

2007年1月22日 (月)

Groovy1.0がついにリリース!!...されてた。だいぶ前に

ふとGroovy(Javaに近いスクリプト言語)の進捗状況を見に行ったところ、いつの間にかGroovy1.0,1の開発中になっていた。

でトップページを見に行ったが、特に「1.0ついにリリース!」的なニュースは書かれていない。。

だがダウンロードのページを見ると、betaとかRCとか付かない1.0版が公開されていた。

ニュースの別のページを見たらようやく発見。

Groovy1.0は1月2日にリリースしていた。

Googleアラートでも、JavaNewsでも紹介されず、長いこと延びまくってたわりにえらい地味なリリースですが、ようやく(少し)安心して使うことが出来るようになって何より。

今後も頑張ってくれればよいのですが。。。

~・~・~・~・~・~・~・~・~・~・~・~・~

Groovyのページ
http://groovy.codehaus.org/

1月 22, 2007 Groovy, Java | | コメント (0) | トラックバック (0)

2006年10月22日 (日)

ニュータイプの作り方

Typeという名の内部クラスを作ってふと気づく。。

  Type t = new Type( ...

おおおおお、「NEW TYPE」だ!!!

どうせなら変数名を amuro にしようかな~、

などと勢い余って、ごみブログを書いてみました

10月 22, 2006 Java, 日記・コラム・つぶやき | | コメント (0) | トラックバック (0)

2006年10月14日 (土)

JavaWebStart普及委員会発足!?

昨日の朝から開発以外のことをほとんどしていない。。。無論、睡眠も。。そういえば、昨日は13日の金曜日だったのに、、何事も無くすごせてしまった。

~ ☆ ~ ☆ ~ ☆ ~ ☆ ~ ☆ ~ ☆ ~

まぁ、それはおいて置いて、

先日、画像拡大ソフト『MugenViewer』をJavaWebStart版で公開しました。
(JavaWebStartはブラウザからJavaを起動するやつです[説明]



正直、Java Web Start大のお気に入りです。


..

AJAX的な画像処理アプリケーションをサーバで動かそうと思ったら、それなりの回線、それなりのサーバ、そして非常に高速なプログラム(アルゴリズム)を用意する必要があります。

MugenViewerも最初はサーバで計算させようと思っていましたが、プログラムが出来上がるにつれて、

 『前処理が重くて、とてもサーバでは処理できん(T_T)』

ということが判明。

MugenViewerは、前処理がすめば、高速に任意倍率で描画できるのがウリなのですが、それもAJAXではとても。。。

~ ☆ ~ ☆ ~ ☆ ~ ☆ ~ ☆ ~ ☆ ~

GoogleMapのように、画像を解像度ごとに分割して送る仕組みは半日もあれば出来そうですが(幻想?)、さりとて、Googleのバックボーンが無ければあのような快適さは実現できるはずもなく。。

やはり弱者がプログラムをできるだけWEB2.0に近づけて配布するには、JavaWebStartのように

・ブラウザからワンクリックで起動でき
・演算は、クライアントマシンで実行して頂く

という形がもっと普及して欲しいと思うわけです。


~ ☆ ~ ☆ ~ ☆ ~ ☆ ~ ☆ ~ ☆ ~

そんな JavaWebStart の魅力は

・サーバのプログラムを差し替えるだけで、自動アップデートができる!

・署名で改ざんチェックするため、署名の無いインストール型のプログラムより、少しマシ!

CGIで起動プログラムを生成すれば、アプリケーションにパラメータを渡せる!
 ( http://www.aaa.com/java/web/start.cgi?param=HELLO みたいに )
※このやり方(邪道?)は、MacOSX(Safariのみテスト)では、上手く動作しませんでした。

・Javaの膨大なライブラリが使える(3D~動画まで)!!

・サーバがショボくても、なんとかなる。

てな感じでしょうか。課題は、挙げるときりが無いのでまたいずれ。。

~ ☆ ~ ☆ ~ ☆ ~ ☆ ~ ☆ ~ ☆ ~

まぁ、そんなこんなで今後は、

 『JavaWebStart普及委員会』

のつもりで、孤独な戦いを繰り広げて行こうかと。。


『品質100点主義の日本』で、(AJAX普及前の)JavaScript以上に心理的な障壁が高い『JavaWebStart』を、世界に先駆けて最初に火をつけるのは、非っ常~に難しいとは思いますが、のんびりとあがいていこうと思います。。

普及委員会の仲間も随時募集しております!!万が一、物好きな方が居たらご連絡ください!

ではまた、いずれ。。

............

・・・眠い

10月 14, 2006 Java, JavaWebStart普及委員会 | | コメント (2) | トラックバック (1)

2006年5月 1日 (月)

XPath リアルタイムチェッカー公開

ちょっとしたツール系?の『XPath リアルタイムチェッカー』(Java Applet )を作りました。

XPathを更新すると、リアルタイムで一致する項目をハイライトします。

Xpath_applet

http://www.noids.net/applet/xpath/index.htm

Java1.4以降で動くはずです

5月 1, 2006 Java | | コメント (0) | トラックバック (0)

2006年3月 9日 (木)

日曜からJava3Dにはまる

ずーっと以前に本を二冊買ったまま、殆ど手をつけていなかったJava3D。

3Dのモデリングツールをトータル30時間ぐらいしか使ったことの無い薄っぺらい(2D的な)私からすると、3Dというのはとても崇高で難しいものという印象があった。

 しかし、トライしてみたら意外にサクサクと。

お約束の「立方体」から入って、「球体」、「円錐」、そして応用編の「アヒルちゃん(本に載っていたなぞのキャラ)」。

Javaのクセにクルクルまわる。

JavaからOpenGLなどを呼び出しているみたいなので非常に快適。

。。。。。

ただ、WEBで取ってきたフリーの3Dモデルを、Java3Dの標準ローダーでロードしてみても何故か全滅してしまった。

。。。。。

方針転換して、ポリゴンの自力生成に挑戦。

2冊の本では、どういうわけかポリゴンに全く触れていないので、ネットで調べながら、軸で回転して図形を生成することに。

そう簡単には行かないだろうと覚悟していたが、少しポリゴンと法線の関係に戸惑ったぐらいで、あっというまに出来てしまった。恐るべしJava3D。。

cup

自作でモデラーを作るという新たな野望がフツフツと。。。

しかし今手を出すのは危険なので、楽しすぎるJava3Dは一旦終了ということに。
またいつの日にか。。。

3月 9, 2006 Java | | コメント (0) | トラックバック (0)

2006年2月 6日 (月)

NetBeans5.0

オープンソースの統合開発環境でEclipseに先行され、危うげなNetBeans。

しかし、NetBeans5.0のGUI作成ツール『Mattise』というのが良いらしい、とのこと。

ネット上でいくつかDemoを見ても、なかなか。

~~

さっそくインストール。起動まで、約10分ぐらい。

とにかくDemoどおりにGUIビルダーをいじってみたが、ほんとうにナカナカ。

抜群じゃないが、結構良い感じ。

しかもSwingとは思えないぐらいスイスイ動く。

EclipseのVisualEditorより、だいぶ快適。

本体の動きも、Eclipseより軽やかに感じた。。のは気のせいだろうか?たぶん気のせいだろうな。

にしても、SWTとSwingの速度が、徐々に埋まってきているという噂?を実感した。

~~

コンポーネント配置の補助機能も良い感じ。

そして、肝心のソースは


、、、び、微妙~
(ここに載せようと思ったが、ゴッチャゴチャで載せようが無かった)

。。。

Eclipseの書き出すソースも、JBuilderの書き出すソースも、みんな微妙だったが、やっぱり微妙。


どれも、これも微妙。。。やはりGUIのように、ある意味図形的な要素を、再利用可能なテキスト形式(ソースコード)にするというのは、よほど難しいことなのでしょう。

微妙でもいいから、せめて記述方法を統一して欲しかった。。

~~

ナニハトモアレ、NetBeans、またチャレンジする機会があったら報告します。

2月 6, 2006 Java | | コメント (0) | トラックバック (0)

2005年12月29日 (木)

リアルタイムで正規表現を試行錯誤

久しぶりに古くなりすぎたホームページを大掃除(更新)した。

ついでに自作の正規表現Java Appletを拡張しようと思い、何を拡張しようか30分ぐらい悩んだが、これ以上特に拡張する必要ないという結論に。
regex

うれしいような寂しいような。
Applet版はもういいので、今度はAJAX版を作ろうかと。。


<特徴>
・参考までに、このAppletはJava1.4以降で標準装備された正規表現ライブラリを使っています。
・入力するたびにリアルタイムで正規表現のチェックを行うので、試行錯誤する時は非常に便利です。
・さくさく入力できるように正規表現の判定を別スレッドで遅延処理してます。

<動作環境>
・Java1.4以降がインストールしてあり、Appletが動く環境(設定)


正規表現Java Appletを起動する!

~~~

ついでに正規表現のお勧め書籍『詳説 正規表現 第2版』。名著なのは確かだが結構いい値段する。覚悟を決めて勉強する気が無いと無駄になるのでご注意を。

12月 29, 2005 Java | | コメント (0) | トラックバック (0)