2010年8月28日土曜日

FXEvaluator で java.lang.NoClassDefFoundError

いろいろググってみたのだが、最初まったくわからず。

似たようなエラーでhide1080さんのブログskrbさんのブログでjavafxc.jarをクラスパス(CLASSPATH? classpass?)に通すという話から、ターミナルからコンパイルしてjavafxコマンドで実行してみたり、javafxコマンドの -classpathに javafxc.jarを(もちろんフルパスで)指定してみたが、どうもうまくいかない。同じファイルを修正してFXEvaluatorは使わずに、単純にStage{}だけに変えてjavafxコマンドから実行すると、netbeansから実行したときと同じように、ミニマムのWindowが表示されるので、FXEvaluatorを使うには何かやはり、javafxc.jar絡みで何か必要な気はするのだが。

そんな中、全く同じようなエラーに会われて解決されたページがあったので、これを参考にdesktop.propertiesファイルを修正したりもしたのだが、うまくいかない。Netbeansを再起動しただけではダメなのだろうか。ログインし直しはまだ試していない。

それで結局、ダメ元でNetBeans6.9.1に戻って、プロジェクトの「プロパティー」の「ライブラリ」から「JAR/フォルダを追加」でjavafxc.jarを指定してみると、何と、うまくいってしまった。

これは、プロジェクトのプラットフォーム(JavaFX SDK on Java 1.6(デフォルト))の「プラットフォームのクラスパス:」に表示されるjavafxc.jarと全く同じものなのだが、どうしてこれだけ個別に追加が必要なのかが分からない。さて何をどう調べれば良いだろう...。

気がついたらソースコードの先頭に書くpackage javafxapplication23の意味も忘れてしまっているので、それももう一度ちゃんと確認しないといけない。

(2010.9.28追記) ITProの桜庭さんの連載「第6回クラスを作る」にpackageに関する情報が。ナイスタイミング。ありがとうございます。
(2010.9.28追記)


だが残念なことに、すったもんだしながらも何とかFXEvaluatorを動かせたものの、自分が欲しかった使い方は出来なさそう。JavaFX ComposerやNetBeans(特にデバッガ関係)のソースが(能力的な面も含めて)読めれば、プレビューやデバッガを参考にしたいのだが、まあ、10年後を目指して。

(2010.9.28追記) JavaOneでComposerやUIコントロールがオープンソースになることが発表されたらしい。素晴らしい!!!! とはいえ、自分が理解できるかは別だが。(2010.9.28追記)

それまではとりあえず、超ヘンテコな作りで作っていくことにしよう。動けばそれなりに面白いはず。

(2010.9.28追記)もう忘れたが、この辺はreflectでやるつもりだったが、舌の根の乾かぬうちに、もっとベタで書いた方が今は好い、ということになっている。最終的には両方(ベタとreflect)使う気。(2010.9.28追記)

2010年8月24日火曜日

Alc. 0.00%

最近、アルコールフリー飲料が売れているらしい。実際自分もたまに飲むことがあったが、好んで飲みたいとは思ってなかった。ところが最近、ビールは飲みたいが車だ、そんな猛暑の最中に飲んでみると、これがとてつもなくいい。

そこでスーパーで色んな種類の0.00を買って試している。不思議なのは0.00%のくせに、酔った気がすることだ。気のせいなのか、アルコール以外の成分に酔っているのか。

この前二日酔いに効くというのでハイチオールCやらノミカタやらいろいろ買って試してみたが、どうも人工的な感じが自分の体には良くない。アルコールフリーならいくら飲んでも酔わないから、そんな薬も要らないし、酒豪になった気分が味わえる。前述の問題は残るものの。

Oracle Sun Technology Updates

当日の資料公開まだかなあと首を長くしたついでにメールで問い合わせしようかと思ったのが昨日だったが、もう少し待とうと思ったら今日、案内を頂いた。ありがとうございます。さっそくダウンロードさせて頂きました。サイトはこちら

自分にとって、ものすごい発見があった。C-1セッション『Java SE 7のポイント』を聞いていて、突然あることに気がついたのだ。そうか、Javaは仮想コンピュータなんだと。何を今更である。が、Javaとは無縁な自分にとって、仮想マシン、VMというと、どうもVMWareに始まる一連の仮想PC-ATを想像してしまうせいか、理屈ではVMだと分かっていても、そこまで実感していたわけではなかったのだ。それにJavaは何かコンピュータらしくない。コンピュータらしくないというよりは、パソコンらしくないと言った方が良い。あくまでJavaとは無縁な自分から見てである。周辺機器の箱にJRE2.0以上と書いてあれば、WindowsでもMacでもLinuxでもSolarisでも動く、そんな世界なら素晴らしい。まあ、無理か。

そういう思いを新たにしたせいか、Java TVというのが偉く難しく感じた。

2010年8月21日土曜日

TIOBE Programming Community Index

2010.8.18、Oracle Sun Technology Updates が目黒雅叙園で開催された。開催概要はこちら

C1,C2,C3に参加させて頂いた。いろいろメモを取ったが、取り急ぎ調べてmemoしたかったのはTIOBE Programming Community Index for August 2010。C2の中で紹介されたのだが、JavaFXの人気が上昇中という話。

Indexを見ると、JavaFX Scriptは31位にランクイン。ActionScriptは26位だ。

この辺(A|B)の記事なのだろうか。原文ページを検索しても、ランキング(31位)以外(※)、JavaFXやScalaなどの文字列は見つからない。去年との比較かもしれないが、去年のデータが見当たらない。

※(2010.8.23追記)「ランキング(31位)以外」を追記

今回のセッションもほぼ満員だったと思うが、JavaFXが注目されている1つの証だろう。Oracleにはぜひ有らん限りのリソースを費やしてほしい。そしてオープンソースにしてRIA開発者やデザイナを呼び込んでほしい。Oracleには強力なJavaによるバックエンドビジネスがあるのだから、間口を大きく広げれば広げるほどうまくいくはずだ。風が吹けば箱屋は儲かる。

ついでにOn2部分も書き換えてしまってはどうだろうか。H.264の年間利用料もOracleにとっては決して高くないのではないか。それに夢を持ったコーデック技術者も沢山いるだろう。なんなら紹介してもいい。H.264を無償サポートした上で、さらに、VP8より素晴らしいフリーのコーデックを世の中に送り出すことができれば、箱屋式にOracleの成長を大きくサポートするはずだ。

漬物石から書棚へ

さてこうして大分JavaFXのコードに馴れてくると、今まで参考にさせて頂いていた”つもり”のドキュメントを如何に"漬物石"にしていたかが分かる。ようやく本棚に入った感じ。まだ机の上に常時置いておくには至ってないが、いつもカバンに入ってるぐらいにして行きたい。

2010年8月20日金曜日

FlyingLetters 3 fly()とPanelのonLayout

この辺の座標系を詳細に理解すれば、フォントの動きやPanelの使い方などがわかりそう。だが座標系はちょっと置いとくことにしたので、とりあえずここまでにしておく。

以上。

と、思ったら、そういえば文字毎に背景が透明になっていて、1文字1文字独立して描かれているように見えるが、文字はTextに入っている。しかしTextの背景は特に設定されていない。よくみると、sceneでfill:nullというのがある。新規プロジェクト作成のサンプルに同コードを入れてみると、これだ。文字だけになった。理屈は分かった気がするが、

(2010.8.24追記)今気づいたが、何か途中で切れている。この先は一体何だったのだろう。

Thunderbird 3.1.1に戻してみる

どうにも緩慢さに限界を感じ、3.1.1に戻してみる。メールのコピーを取ると、1GB以上あり、整理しなければと思う。がしかし良案なし。しかも最後の方でFinderが予期せぬエラーになる。ファイル数とサイズが若干合わないので、置き換えないでコピー。すると数はあった。サイズがまだ合わないが、そこは諦めることにした。

Thunderbirdの日本語サイトにある「提供されたビルド」の項にあるリンクだと*.os2.*になっている。一段上がってmac/ja-JP-macをのぞくとdmgファイルがあったので、これを頂く。

微妙。もっとさくさく動いていた気がするが。若干ではあるが、アカウントのツリーのスクロールが早くなったようだ。だが、もっとさくさく動いていた気がする。ということは、気のせいか、メール自体が1GBもたまっているのが悪いのか。しかし古い話もまれに必要になる。ということでアーカイブしていないところをアーカイブしてみる。あ、そういえばアーカイブしたのは最近。それが原因だったりして。といっても戻す方法が分からない。単純に受信トレイに移動すればいいのかもしれないが、変なことをしてまた遅くなると困るので、ゆっくり時間を取って、最初からアカウントを設定し直すぐらいのつもりで出来る時までペンディングに。

文部科学省からプログラミン

文部科学省のプログラミンのサイト

28匹のプログラミン・・・アニメ王国日本、あるいはかわいい国日本、その"らしさ"がストレートに発揮されていて、とても良いと思う。ただつい、28匹のプログラミンの名前や機能にはちょっとフフフな思いを抱いてしまうが。

ここで使われているダイアグラム(と言っていいのだろうか)は、最近知った、AndroidかんたんプログラミングツールApp Inventor
でも使っているOpen Blocksとかいう代物だろか。スクラッチに似ているようにも見える。ただスクラッチはダウンロードして実行してないので、そう見えるだけかもしれない。

いろいろ聞いてみたいことがあるので、文部科学省の問い合せのページへ進んでみた。すると、詳細に分かれているのは良いのだが、さてプログラミンへの問い合わせは・・・どこへ出したら良いものか。プログラミンへの問い合わせの受付エントリも載せてほしい、という言い訳を添えて、一番近いと思われたところで質問を送らせて頂いた。ご回答頂けたらmemoするつもりだ。

おとなへの説明会や保護者への勉強会なども開催してほしい。

すでにプログラミンをツイートすると独自ギャラリーにエントリするサービスが早くも実施されていたりするが、プログラミンの利用規約も見つからず((2010.8.31追記)見つかった)、わりと軽いノリにお役所らしからぬフットワークの軽さを感じ、実に好感が持てたのだが、少々軽すぎではないだろうかと心配してみたり。自分が心配したところで始まらないのだが。

プログラミン自体はFlashで作られているようで、当然JavaFXの守備範囲に入ってもおかしくないだろう。ただ私はこの手のブロックものはどうも。プログラミンを検索すると、作られた方の物とおぼしきツイートも見つかるが、それ以上つっこんで見てはいない。何となく今はまだ制作者サイドのお顔を拝見するには早いという思いが。

"コンピュータ関係"という言葉で表していた本業界人初期の頃は(プログラミング言語ではなくリアルな)ロゴブロックのようなブロックの組み合わせでプログラムを書くべきではないかと真剣に信じていた時代があった。だがそれから暫くして、Javaがまだ出てそんなに経ってない頃だったと思うが、Javaのそういうブロックを繋いでプログラムを作るツールが出て、確か買ったんじゃなかったかな・・・か、買おうとして寸前でやめたか。それが生き残ってない理由は知らないが、そのとき思ったのは、ボリューム(規模)が大きくなると、とても辛そうに見えたこと。自分には致命的に思えた。以来、ブロックはダメ信者になってしまった感がある。だからYahoo! PipeやMicrosoftのPopfly等を見ても、まず敬遠して一塁に歩かせるところから入ってしまう。

プログラミンから何かアンチブロッカーな自分を思い出したが、自分が勘違いしているだけだと思うので関係各位におかれましてはどうぞお気になさらなぬよう。

2010年8月19日木曜日

FlyingLetters 2 警告の件

function fly()の中で警告がでる。

警告:In animation target node.opacity, node is not a constant, but will be treated as such. You may want to rewrite as:
def temp = node
temp.opacity => x

このnodeは、for(node in chars)だが、not a constant だからdefにしろと? defはconstant?ちょっとおかしくないだろうか。確かVideoCudeでbindしてたような。ほらやっぱり。bindして変化するのにconstantっていう表現は変ではないのだろうか。解釈の仕方がちょっとわかりかねる。とりあえず言われるがままにdef temp = node;にしようと、at(3s){temp=node;とかくと、そこには書けないからブロックレベルに書いてねと窘められたので、その上の他のdef達の並びに書く。またat(3s){}およびat(6s){}の中のnode.opacity => op2 tween i2;などを全て、temp.opacity => op2 tween i2;のように書き換え、実行。変更前と何も変わらないように見える。結局警告は警告のようだ。ただ警告を出したままにするのは自分には原則あり得ない選択(c言語等の場合)なので、ちゃんとした理由と対処方法をいつか学びたいものだ。

2010年8月18日水曜日

FlyingLetters

FlyingLettersのページはこちら。

スマートフォントでやりたいことの1つ。この動きそのものがどうという話ではないが(もちろんこれ自体は面白い)、動きのある活字。Sign O' the Times @ priceのような派手な動きではなくとも踊るテキスト。テキストとしてみればフォントというのは変かもしれないが、フォントが組み合わさってこそのイメージがある。7人の小人。ただGIFアニメみたいな絵文字は自分的にはNG。あくまで文字の話。

それはさておき、Sign O' the TimesのぱちもんらしきVを見てたら、こういうアプリなら簡単に出来そうな気がしてしまった。早く気のせいじゃなくなるように。勢い、薄れた記憶を補おうと思わず本物のビデオクリップ集DVDがあったのでAmazonする。¥2622-。お金で買えない価値がある、アプリケーションをJavaFXで。

なんかいきなり警告だが、実行は問題ない様子。警告はバージョンが上がってきてることによるものではないだろうか。透明で面白い。文字だけそこにあって。ファイルはletters.fx 1個。

classの宣言の中でクラスと関係ないローカルな変数varを勝手に宣言するってのはいいんだっけ? なんか、あまりに当たり前な顔して書いてるように見えるけど、今までこんなのあったか? ないよね?(と勝手な思い込み) でも確かに
def rotation = Timeline {
var test:Integer;
...
}
も書けるね!
というか、Letters.fxではPanelの宣言で中にvar widthとheightをやってる。で透明な文字は面白いのだが動かせないのでドラッグを入れたかった。そこでMosaicからtopRectにくっついていたドラッグ関係の処理をパクってくる。と、あっけなく動いてしまった。ちゃんと理解しているわけじゃないというか、半信半疑で自分のモノになっていないのだが。そこはさっきの座標系がちゃんとしてない辺りに多くの要因がある、と思う。

足したコード:
var stageDragInitialX:Number;
var stageDragInitialY:Number;

def panel: Panel = Panel { <-この行は元々ある。この中に以下の2つの関数を貼る。
....

onMousePressed: function(e) {
stageDragInitialX = e.screenX - stage.x;
stageDragInitialY = e.screenY - stage.y;
}
onMouseDragged: function(e) {
stage.x = e.screenX - stageDragInitialX;
stage.y = e.screenY - stageDragInitialY;
}

....
}

元は単に Stage { だったものを変数に代入し、Panelで使えるようにした。
var stage = Stage {
...(省略)...
}

以上。

あと、まだ馴染めないもの。
def chars = for (i in [1..text.length()]) Text {
...(省略)...
}
とか、
anim.keyFrames = for (node in chars) {
とか。配列、もとい、シーケンスなのは分かるのだが、どうしても[]が恋しくなる。かといって、
def chars[] ... 
とは書けず、
def chars:Text[] ...
と書くのは憚られる。

Mosaic 14 ImageButton

ImageViewを派生させているが、果たしてこれが常套手段か。これはこれで(何となく)分かるのだが、釈然としない感じはどこから来るのか。

まあ確かに他にもやり方はあるだろうし、色々試してみたいことはあるが(実際やろうとしていたが)、それはまた今度にしよう。それよりもっと色んなコードを見る方を優先させたい。せっかく沢山サンプルがあるのだから、VideoCubeとMosaicとの違い以上の違いもあるかもしれない。

ということでそろそろMosaicは終わりにしようと思う。他にコードを見るべきだという声と、今すぐ作りたいプログラムがあるんですけどーという声とが不協和音を奏でる前に、とにかく他のコードを早くもっと見るべきだと思うから。

Mosaic 13 translateXなどの座標系

x,scaleX,translateX,layoutX,minXなど、xyzの座標位置を示す変数が多数ある。どうも分かったようなわからないようなところに持ってきて(API Ref.を見ていたら)layoutBounds(@Node)が出てきてお手上げ。この辺は少し時間をかけて見ないと無理。

Mosaic 12 __PROFILE__

やっと見つけた。JavaFX Language Referenceに書いてあった。Pseudo-variables
pseudo : スードウ:疑似の。

いやサンプルとかでそれ自体は結果から想像できたのだが、定義が見つからなかった。

Mosaic 11 パッケージ

ImageButton.fx

前から気になっていながら無視していた、プロジェクトのツリーでいうと、ソースパッケージの下のmosaicの黄色い四角い俵のようなアイコンは何だろう。今さら何かというと、ImageButtonの中で使っているpngが、ソースパッケージの下のmosaicと同じレベルの、やはり俵アイコンでmosaic.imageとあって、その下にあるからだ。イメージをプロジェクトに含めたい場合、こういう格好にしなければならないのか、疑問に思ったわけだ。


ここで懸案だったメニューだしっぱの弊害があったので書いておく。いまプロジェクト名Mosaicを右クリックしてメニューを開き、[新規]->で開いたメニューに俵アイコンで「Javaパッケージ...」と表示されるのを見て、ああなるほどこれか、とブログエディタ@Firefoxに移ると、メニューが表示されたままになる。見易くていいじゃないか、という場合もあるが、出来れば消したい。


フォルダとしてはsrcの下にある。

わからない。まいいや。

Mosaic 10 肝心なことを忘れてしまった

確か、LinearGradient関係で、ネストできる話が何処かに載っていて(日本語)、input(変数/プロパティ)で指定して...みたいなだったと思うのだが、さっぱり思い出せないし、見つけられない。あーしまった。LinearGradientにinputなんて無いしなあ...。effectかとも思ったけどそれはPerspectiveTransformのほうだし。そっちだったっけ。何かコードはうっすら覚えているのに。本当にJavaFXだったかもあやしくなってきた。あーやばい。ウェブ履歴ONにしようかな。

(追記)
APIの中を検索すると、 javafx.scene.effect.Reflectionnのような javafx.scene.effect.*にinputプロパティを持つものがあり、ここにEffectオブジェクトをセットするようになっているので、この辺か。

(追記)あったー!
普通に桜庭さんのITProだった! あれなんでググれないかなあ。大変失礼致しました。

ふー大騒ぎだよ。

2010年8月17日火曜日

Solaris 11

これからはより最適化されたアプライアンス、まさにSOFTWARE.HARDWARE.COMPLETEとして開発されるという面に期待大。発表された計画(各種ニュースソースを参照した)によれば、5年以内にトランザクション処理能力が40倍になる見込みだという。60年代のIBMの再来と自らを表する本気度が伺える。

そしてそれらのソースコードの大部分はオープンソース(CDDL、その他)で公開されることになっている。最新のWindows Serverのソースコードが発売直後に公開されたら驚くだろう。実際、Solarisがやろうとしていることは、そういうことだ。ただし、OpenSolaris Forumsの投稿にあるように、OpenSolarisコミュニティ主導の開発モデルは終了となってしまう。

これについて、OpenSolarisの関係各位の落胆もあるようだが、すでにILLUMOSという見るからにクールなプロジェクトも始まっており、畏敬の念を抱かずにはいられない。

ハードウェア、ミドルウェア、アプリケーションが一体となって高性能を発揮するためには、アプリケーションのためのハードウェア、ミドルウェア、開発環境を作らなければならない。例えば数年間前のインテルのセミナーで聞いた話だが、インテルのC/C++コンパイラには、最適化手法として、一度実際に実行して、その結果を元にリコンパイルすることで実行に即したバイナリを出力する方法を持っている(最近のコンパイラ全てに共通のドレンドなのかは知らない)。その時のデモでは、相当の高速化が達成されていた。確かキャッシュを効率良く使えるようになったことが要因の1つだったと思う。

コンピューティングに必要なリソースを、実行するアプリケーションに合わせてチューニング出来れば出来るほど、当然性能は高くなる。もし40倍のトランザクション能力というのが一般的な数値なら、特定の基幹システムやWebサービスにチューニングすれば、さらに高めることが出来る可能性がある。

もちろんこれは裏側から見た一面に過ぎない。どんな開発環境でアプリケーションを開発するのか、すでに開発した運用中の資産をどう保護(延命、改良)していくのか、課題は多い。

如何に優れたアイディアであっても、蓋を開けてみなければ分からないこともある。それが失敗だとしたら、誰が責任を取るのか。新しいOracleは、果敢に挑もうとしている。

車に詳しくないのにこんな例え話をするのも何だが、コンピュータ界のAMG、ALPINA、あるいは憧れのTesla Roadsterの誕生を想像すると、ワクワクせずにはいられない。

自分もいつかその輪の中に入れることを願って。

(追記)
をっと! Tesla Roadsterのスペルを調べようと思ったら、いつのまにかJapanが出来てるじゃないか。しかも試乗会。ヨシヤバテ。いつか買えますように。

Mosaic 9 適当にもほどがあるが

ThumbImage.fx

とりあえずexecとやらでfirefoxを起動してみよう。さてどこに入れるかと言えばやはり単細胞な自分にはonMouseClickedしかない。onMouse*イベントは、ドラッグに応じてサムネイルが移動したり中央付近で大きくなったりさせるために、いくつかフラグをいじっているが、まずは何も考え無しにonMouseClickedにコードを入れてしまおう。

おお普通にClickした感に応じてFirefoxが起動する! もっと何かドラッグの終わりでマウスボタンを離してもClickされてしまうのかと思ったが、そんなことはない。

ただ単純にFirefoxを起動すると、二重起動が弾かれるので面倒。

そこで別なウィンドウに大きめの写真をペロんと表示してみる。いきなりStageを書いていいのか。おお、出るじゃないか。

プログラムとしてそれはないだろうという向きはあるだろうが、こうして書いてみて、改めて自分が作ろうとしているもののイメージが反面的に見えてくるから面白い。


override var onMouseClicked = function(e) {
/*WebDriver driver = new FirefoxDriver();
driver.get("http://www.google.co.jp/");*/
//var cmd = [ "/Applications/Firefox.app/Contents/MacOS/firefox-bin" , "http://www.flickr.com/photos/41613114@N08/4887658899/" ] ;
//var cmd = [ "/Applications/Firefox.app/Contents/MacOS/firefox-bin" , "http://www.flickr.com/photos/{photo.owner}/{photo.id}/" ] ;
//Runtime.getRuntime().exec(cmd);
Stage {
scene: javafx.scene.Scene {
width:800
height:600
content: ImageView {
image : Image {
url: "{url}_z.jpg"
backgroundLoading: true
}
}
}
}
}
}

ところで<pre>が横幅で切れるのをどうするんだっけと思うだけで何もしていなかったが、とりあえずoverflow:autoをセット。あちこちにセット。折り返しも考えたがとりあえずスクロールで。

それと忘れていた。やはりすぐ書かないとダメだよなあ。ソースコード連動型ブログを誰か作ってくれ。レイヤがあってさ、バージョン管理ができてさ、欲を言えばそれ自動で「この辺でバージョンかな?」みたいなちょい賢いやつ。複数のコードを試し書きできて、メトリクスから選べて、で公開ってやるとwiki...は難しすぎて使いこなせないから平場なブログっぽいWebサイト/ページに展開してくれて、それを繋いで同じクラスやメソッドや変数やデザインパターンで縫う、と。

ほらこういうことばっかりやってるからすぐ目的を忘れてしまうのだよ。
    scene: javafx.scene.Scene {
    scene: Scene {
だとエラーになってしまうので。

この使い分け、勘所がまだまだ全然だ。Javaの呼び出しといい、もう少し構造的なものがスパッと分かる明晰頭脳にしたい。

不謹慎だがおもしろすぎると言わずにはいられないJB

今回ばかりは「Jail Break」に感謝』という控えめなタイトルに映るこの記事によると、iPhoneをJBするのにPDFのセキュリティホールを利用しているという。しかもご丁寧にインストールスライダをつけるというシニカルさ。 こぼれる冷笑を扇子で仰ぐ薄目顔が目に浮かぶ。

JBは特に必要ないのでやらないだけだが、誰か真剣にこの世からセキュリティホールを完全に消し去ってくれないものだろうか。

Mosaic 8 execよりWebDriverを使ってみたいが。

ダウンロードしたファイルが良くなかったのが、jarファイルの追加の仕方が悪かったのか、コンパイルできない。これも置いておこう。WebDriver自体はとても面白そうなので、いつかソースコードも見てみたい。あとはWebkit。さすがに敷居が高い。

2010年8月16日月曜日

Mosaic 7 PhotoPullParser.fxの[赤!]マーク

プロジェクトを開き直したら復活してしまったため、正確には分からないが、「ファイルの解析中にエラーが発生しました」とか何とかいうエラーがツールチップで表示されていたと思う。

単にプロジェクトを開き直しただけでなく、オリジナルのプロジェクトを開いて閉じて、変更を加えたプロジェクトを開いたらエラーが消えていた次第。

ファイル名の頭のFXアイコンに赤!がつく以外は通常のコンパイルエラーのように、どこかの行に赤!がつく訳でもなく、何がエラーかわからない状態。

前も再構築(プロジェクトを削除して構築)をやったら回復したエラーがあったが、今回は利かなかった。また、PhotoPullParser.fxは編集していない。やったとすれば、デバッグでブレークポイントを張り、onEventのeventの内容を[デバッグ]-[式を評価]で見たのと、コールスタックが見たかったが見れなかったので、冗談で[デバッグ]-[スタック]-[呼び出し元を現在に設定]をやってみたぐらい。その後実行を継続し、(mosaic上の検索窓で)"sun micro"や"oracle"を検索した。oracleで(検索したとき)androidのロゴのロボットの向かって右目に目玉焼きが乗ったイラストがあったがあれはどういう意味だろう。そんなところか。ただその前から赤!がついていたような気がするここまで言っておいて何だが。

目玉焼きのイラストが気になるので、クリックしたらflickrのページが表示されるようにしたいがさてどうしたものか。できればJavaFX上で表示できれば良いが、そんな凄い機能が内蔵されているとは望み薄なので、ブラウザを起動でも好しとしよう。

2010年8月15日日曜日

Mosaic 6 defはoverrideできない

変数のオーバライドで、varは出来て、defは出来ない。なぜだろう?といっても出来ないものは出来ないのだが。

例えばプリセット感覚でLinearGradientの値を設定したものをそのままクラスとして定義できると自分の感覚に合っていて良いのだが。繰り返し数の多い少ないではなく、感覚の問題。他人が作ったグラデーションをただ黙って使いたい。あるいは自分の好きなグラデーションを有無を言わせず使わせたい。

で、いろいろやってみると、自分で定義したクラスの中で宣言した変数にしろ関数(でLinearGradientを返す)にしろ、それをRectangleのfillにセットすると、そのRectangle自体がずれるというか表示されない(完全に消えたのか、ずれたのかは不明)。

だがMain.fxに直に書いた変数にLinearGradientをセットし、それをfillに代入する分には問題ない。
 
def crecendo = LinearGradient {
startX: 0.0, startY: 0.0, endX: 0.0, endY: 1.0
proportional: true
stops: [
Stop { offset: 0.0 color: Color.GRAY },
Stop { offset: 0.5 color: Color.BLACK }
]
}
var bottomRect : Rectangle = Rectangle {
y: bind (height - bottomRect.height)
// make the bottom rect slightly bigger to fit in TV 'safe area'
height: bind (tagTextBox.boundsInLocal.height + 35)
width: bind width
fill:crecendo
/*
fill: LinearGradient {
startX: 0.0, startY: 0.0, endX: 0.0, endY: 1.0
proportional: true
stops: [
Stop { offset: 0.0 color: Color.GRAY },
Stop { offset: 0.5 color: Color.BLACK }
]
}
*/
}

LinearGradientのproportionalがtrue(相対)だから、変数だと参照時に参照するRectangleに合わせるからかと思ったが、同じ変数を別なRectangleにセットしても問題ないので、そういうわけでもなさそう。

var tempRect : Rectangle = Rectangle {
y: bind (height - bottomRect.height - 50)
height: 35
width: bind width
fill:crecendo
}

bottomRectとtempRectは両方ともちゃんと表示される。


まあよくわからないが、これ以上追求してもしょうがないので、現状はそういうものだということで好しとする。そもそもfill:LinearGradient {...}って書くならfill:SomeDesignersGrandientって書けてもいいじゃないか的な発想でしかないので。

Mosaic 5 Main.fx

Main.width

このMainとは何だ? Main.fxのMainだろうか。確かにMainにpublic var widthがある。きっとこれだろう。だが、Main.widthという構文がいまいち分からない。Mainはクラスか。Main.classがあるしたぶんそうだろう。だがこの仕様がどこかに説明されてないだろうか。SDCのJavaFXチュートリアルにも"書き方"は書いてある(one.someMessage)。

「javafx ファイル単位」で検索。

偶然以前注目していたTerra's Weblogが。JacaFXでSCADA UIが面白い。実務でBACNet対応などの話があるが、JavaFXを実戦配備は品質的に今は無理。成熟してVBの座を奪ってほしい。

Terra's WeblogからJavaFX in Styleに飛んで、漠然とコードを見ていると、LinearGradientが出てくる。Mosaicで見た気がしたのでソースを検索すると、topRectとbottomRectで使っている。http://weblogs.java.net/blog/javakiddy/archive/2008/12/javafx_in_style.htmlでLinearGradientを
alcで引くと"直線的に傾いた"。斜線か。だがAPIリファレンスを見ると、色の話。線形グラデーションか。「線形グラデーション」でググると、HTML5で線形グラデーションを指定するメソッドにcreateLinearGradientが。なぜ日本語だとグラデーションになるのか。

Main.classから「throws」を検索。意味は分かったが、例外クラスリストをシグネチャの次に並べて書くというのは何かなあ、変なのって感じ。

それにしてもリンクを張るのが大変。自動的に張ってくれないだろうか。

2010年8月14日土曜日

Mosaic 4 PullParser

PhotoPullParserはPullParserを使っている。PullParserはどこか日本語の詳しい記事を見た記憶があったが、見つからない。何となく覚えているのは、パースの要所要所でコールバックされることだが、Pullparserじゃない方法も並記されていたはず。それが気になってしょうがない。

こういうときって不思議と探すと見つからないんだよなあ。はてぶしたはずだけど、見つからない。ブックマークしたサイトをググってほしいのだが、方法が分からない。Googleで検索対象に複数URLを指定しても今ひとつ反応が良くない。

とりあえず本当にあったのかどうかも分からない情報のことは忘れてくれ。

PhotoPullParserも本当分かりやすい。

topRectのonMouseDraggedでstageのx,yをいじっている。これは何だろう?と思い、今日はとっても体が冷房病的にきついので、ブレークを張ってみることにした。実は机上で追えないのをすごく嫌う性質(たち)なので、自分的には御法度である。また、去年かもっと前か、ブレークが全然利かなかった不信感もあり、ほとんど投げやりにだったが、大変失礼しました。ちゃんとブレークするじゃん! 一生懸命写真をドラッグしてたが、何の事はない、Mosaicの全体ウィンドウをドラッグしたら掛かった。topRectって書いてあるじゃない。ソースを追うのに定義/参照でやるのが長年染み付いてるせいと冷房病のせいで、なかなかリズムに乗れない。

じゃ写真はどこでやってるのか。

とみていくと、いままで見た事もないThunbImage.fxというファイルが出現した...わけではなく、最初からもちろんそこにあったのだが、何で気づかなかったかなあ。完全に凍ってます。恐るべし冷房力。

これもざーっとみたところ、とっても分かりやすくて、ただzoomTimeline.keyFramesがrotate()の中で設定されているのが何でかなあというぐらいか? ぐらいか?とは大きく出たが、zoomTimelineを見ていくと全くついていけないのでこの先はまた後で。ちょっと今日中に戻って来れるかどうかは微妙だなあ。

Mosaic 3 関数ポインタ

PhotoPullParserクラスに好例があった。
// Completion callback that also delivers parsed photo metadata
public var onDone: function(data : Photo[]) = null;

こうしてみるとほら、Cと変わらない。

Cと言えば、関数ポインタに始まって関数ポインタに終わると言っても過言ではない・・・とまでは言えないが、通信制御系システムではよく見る光景だ。

ここにも追記した通り、馴れ、馴染みの問題、如何に体に染み込むか、違和感を感じないか、が大きい。

気が済んだか? Thunderbird 3.1.2

何気に更新したらCPU使用率50%以上を連発。MacBookProのファン全開。動作緩慢。参考記事発見できず。3.0にダウングレードしようとダウンロードしつつ、どうしても過去のメールを探したかったので、何とかそのまま使い続ける事30分?ぐらいだろうか。何か気が済んだのが、突然CPU使用率0%に。スレッド数が13から11に減少。

お疲れさまでした。

今度から、何か裏で動いているなら、何処かに状態表示してくれないだろうか。素人でも分かる場所に。ちょっとこれだとTVには入れられないなあ。

それにしても何してたんだろう。
分からないのに使っていていいのか?>自分。

(2010.8.14追記)動作緩慢は直ってないことが判明。プラグインも外した。セーフモードで一度起動したが変わらず。やはり3.0に戻すべきか。(2010.8.14追記)

2010年8月13日金曜日

ついに訴訟へ。どうなるAndroid、Java、そしてJavaFX。

以前ある方にAndroidはIPの問題が決着していないというお話を聞いていたので、こうなることは予想していたが、Oracleが望むのは何だろうというのがよく分からない。製品も出そろってる状況でよもや出荷停止や開発中止のような事はないだろうが。

こちらの詳しい記事によると、「実際、Javaプラットフォームの仕様書やソースコードには、(c) Sun Microsystemsと記されている。」らしいw。

(追記)と思ったらもう続編が。ありがとうございます。

だが元Sunの元CEO、ジョナサンさんはそのブログで、Android立ち上げに賛辞を贈っていた(日本語版|英語版)。

だがその10日後にはJavaの分断化に懸念を表明していたり、こんなことを言っている人もいたりで、Sunが買収される以前に本当はどう考えていたか知りたい。

Mosaic 2

Hbox,Vboxについては、ここに非常によいチュートリアルがある。ドメイン名が微妙なのだがどうか無くなりませんように。もしOTNに移行して頂いたら、異動先がすぐ分かるようになってますように。本当にお願いします。

ところでMosaicはFlickr APIを使う。それにはAPI Keyが必要で、これはソースコードに埋め込まれている。デバッグやテストで使うのに、これを使い回して良いのだろうか?(*) API Keyを申請しようにもアプリケーションがあるわけではない。こういう場合はどうするのだろうか。FAQなど調べてみたが、これといってズバリな回答は見つからない。

(2010.8.27追記->) (*)サンプルのページにサンプルで使っているAPI Keyは使わず、自分でAPI Keyを取ってくれと書いてあった。
"Do not use the api-key used by this sample. Obtain your own key from flickr.com"
(<-2010.8.27追記)

だがググってみると、結構みんな適当にアプリ名と内容を書いて取得している様。そこで自分も適当にというわけではないが、将来のアプリケーションとそのためのテスト、みたいな感じで申請、API Keyをゲットした。すると申請の返す刀(次に返ってきたページ)でAPI Keyが取れたので、早速マイキーでMosaicしてみると、問題なくアクセスできた。

これで多少コードを変更してMosaicunになっても、自分のキーだから、文句があったら私に来るのではないかと思う。

あと前から疑問に思っていた、自分アプリをユーザが使う場合にAPI Keyはできればユーザに取得してほしいなあという考えはやはりそうみたい。FlickrのHelp Forumにも載っていたのでメモしておく。

(2010.8.14 追記->)
Help Forum と FAQを勘違いしていた。もう一度探そうと思ったらなかなか見つからなかった。Help ForumのSearchボックスに「api key」で検索。
(<-2010.8.14 追記)

Main.fx

なんか私ごときが烏滸がましく申し訳ない。VideoCubeよりかなりきれいなソースコードの出で立ち。とても見易いのか、そもそもJavaFXが分かり易いのか。少しは分かるようになって来たのか。こうなると俄然、「宣言へ移動」が欲しくなる。MLに相談しちゃおうっかな〜と他力大本願! MLはjp.netbeansとJavafx.jp、どちらにすべきか。とりあえず検索で当座乗り切ろうと思う。

すごく分かり易いというのが今現在の印象、感想。

2010年8月12日木曜日

Mosaic

Mosaicといえば、WWWブラウザの元祖的あれだろう。しかしこれはJavaFXのサンプルコードの話だ。ここからダウンロードできる。

VideoCubeで反省したのでここはさくっと行きたい。ぼやぼやしてたらもう8/12だ。

まずアプリの仕様から。

1. キーワードで写真をFlickrからダウンロード。ただしキーワード以外の条件は不明。
2. マウスが写真の端のほうにあたると写真が回転する。回転にムラかバグがある。
3. マウスが写真の真ん中辺にあたると写真が正面を向いて止まる。
4. 写真をドラッグするとウィンドウの真ん中付近で大きくなる。
5. 写真じゃないところからドラッグを始めると、マウスが写真に乗ったとき、回転したり大きくなったり、規則性の良く分からないランダムな動きになる。

ここで突然firefoxがぶっ飛んだ。再起動してブログを開くと何かエラーが表示されたが、再度アクセスすると大丈夫な様子。2行ほどロス。

6. 拡大した写真の上にサムネイルが被ることがある。
7. 検索ボックスに入れたキーワードは空白で区切ると+で繋がれる。

とりあえず以上。

JavaFX Composerをさわってみて

1. 円や楕円を移動すると、ガイドと大分ずれた位置になる。

2. Composerとは関係ないのかもしれないが、プロジェクトで
・デスクトップビジネスアプリケーション
・モバイルビジネスアプリケーション
だけがComposerが使えるようだし、この2つとJavaFXScriptアプリケーションとではコードの見た目が随分違う。これって何? どのドキュメントをフォローすれば良いのだろうか。

3. Composer用のコードが手で修正できない。無理矢理別なエディタで書き換えると、Polygonのケースではエディタのフォーム上はコードに沿って表示されたが、プロパティは前のまま。つまりソースとは別に何処かに管理されているということだが、さて。

4. 部品のコピーができない...これは一体、Macだから?

元々部品の重なりを変えた場合コードがどうなるのか知りたかったのだが、やはりsceneのcontentの順序が変わるだけのようだ。

いまさら聞けないnetbeans 6.9/6.9.1 ヘルプが英語なんですけど

前は日本語だったような気がするが。なんとなく6.9でプラグインの更新をしてからな気がするが、全く定かではないどころが大嘘かもしれない。なぜなら、残っていた6.8を起動してみると、何故かJavaFX(のヘルプ)だけ日本語になっているから。どうしたことだろう。6.9.1が出たというのでそちらを試してみたが解決せず。とりあえずメニューをMac式にし、netbeansのtwitterに言ってみて先送りに。

Guti

すごい歓迎ぶり。ベシクタシュ、ちょっと怖いかも。
http://www.youtube.com/watch?v=3vLyiB_l2ho

Guti talks to MARCA
http://unamadridista.wordpress.com/2010/08/09/guti-talks-to-marca/

プレーも早く見たい。

VideoCube Final

やっと終わり。OpenOfficeで書いた内容を転記するのにこんなに時間がかかるとは思わなかった。

ということで、なかなかまとまらないが、3D展開は除いて、大体の作りと雰囲気は分かった。JavaFXで感覚的に不思議なのは、プロパティなのか変数なのか、その違いが基本的にないのだと思うが、初期化のみ可とかいうアクセス(識別子)があったりする辺り。値をセットしてるのに=じゃなく:で良かったり。それに直にインスタンスを生成する場合、後からそれを変更しようと思ってもできない。やり方があるのかもしれないが、今は変数にしておくか、変更したい変数に別な変数をbindして後でその変数を変えるかの何れかにしている。

Stage {
title: "Application title"
scene: Scene {
width: 250
height: 80
content: [
Text {
font: Font {
size: 16
}
x: 10
y: 30
content: "Application content"
}
]
}
}

おなじみの新規プロジェクトで生成されるMain.fxのコード。

var mstage = Stage {
title: "Application title"
scene: Scene {
width: 250
height: 80
content: [
Text {
font: Font {
size: 16
}
x: 10
y: 30
content: "Application content"
}
]
}
}

これを変数に代入しておくと、

mstage.title = "後から変更したタイトル。特に意味はないけど。";
var mtexts = mstage.scene.content[mnode | mnode instanceof Text];
for (mnode in mtexts)
{
var mtext:Text = mnode as Text;
mtext.content = "new text({mtext})";
}

のように後からstage.titleやscene.contentが使える。とはいえ、突然降って湧いたようなシーケンスの抽出だが、いろいろ調べているうち、こうなった。最初はこう。

for ( mnode in mstage.scene.content)
{
var mtext:Text;
if ( mnode instanceof Text)
{
mtext = mnode as Text;
mtext.content = "new text{mtext}";
}
}

こっちのほうが速そうだが、switchが使えない不満をシーケンスの抽出で紛らわせてみた。シーケンスについてはこちらを参考にさせて頂いた。ありがとうございます。

実は最初、contentの中のTextを選び出すのに自分のクラスが何かを調べる方法-instanceof-が分からなくて、"Javafx クラス 調べる"だとヒットせず、"java クラス 調べる"で引いてinstanceofを得、"javafx instanceof"でようやく。ちなみにこちらの演算子一覧表がわかりやすい。ありがとうございます。

instanceofか。なんで演算子なんだーjava。どう考えてもクラス名っていうのは自分のプロパティだと思うが。つまりオブジェクトの要素であって、なんならクラスに属するぞオブジェクトであってもいいぐらい。というより演算子というマジックに幻惑されるだけで、printlnみたいなJavaFX内蔵関数みたいに思っておけばいいのか。


エルサルバドルうまい! 難を言えばちょっと薄い。濃いめに入れても変わんなそうだけど一応やってみよう次回。ゆえに非常にあっさりしていて豆そのものに比べてナッツの風味はとけ込んでおらず、クランベリーのような酸味の中に果実特有のさわやかさが顔をのぞかせる。


つまり、if (isInstance(mnode,"Text"))やif(mnode.className == “Text”)(※これは便宜上勝手に書いてるだけ) と if ( mnode instanceof Text )との違いしかなく、後者(演算子)の方が短い。わかる、わかるよそれは。しかもinstanceofがメッセージっぽくて良い。isInstanceOfなら尚。わかる、それもわかる。例え的外れだとしても。でもね、節操とか、統一性とか、あると思うわけですよ。何が故の演算子か。やはりそれは数学的背景なんかが望まれるわけで、むしろそういったものは関数ライブラリ〜とかいってクラスライブラリだったり関数ライブラリだったりしているのが現状ではないか。実際、演算子で算術っぽくないのはjavaならinstanceofとlength(javafxはsizeof)、javafxでさらにreverseとindexofがあるだけ。こうしたことに答えてくれるinside java & the FXみたいな本が(できればWeb連動で)出版されると嬉しい。

さて話を本当に戻してまとめよう。

1. 定周期処理はTimelineで書ける。
2. イベントハンドラはonMouseClickedのようにプロパティ(的な変数)になっている。なんかcssの擬似クラスみたい。


(2010.8.14追記)
というより、関数ポインタだと思えばいい話だった。この辺、このプロパティっぽく感じるところへの何かこう、勘違いが拭いきれないが、それも徐々に薄らいでいると思う。要するに馴染みの問題で、馴染んできているということではなかろうか。
(2010.8.14追記)


3. プロパティの変化捕捉みたいな処理はon replaceで書ける。変数全般で書けるのが偉い?
4. bindは対象となる変数が変化したら再評価される。※1
5. PerspectiveTransformとCustomNodeは相性が悪いのか、マウスイベントが拾えなくなる。あ、Windowsで試してないじゃん。

これだけ分かれば後は3D->2Dの座標変換が分かればVideoCubeは書けるはずだ。

他に、

6. 何気に派生クラスを作ることは何となく分かっていた。
7. CustomNodeは抽象クラスなのでcreateのoverrideが必須なのもいつの間にか知っていた。

(2010.8.16追記)createはoptionの間違いだった。children変数が空な場合。APIリファレンスにあるようにchildren(Nodeのシーケンス)に設定がthe preferred choiceなので好ましい、ということのようだ。(2010.8.16追記)

8. Stage、SceneときてSceneのcontentの配列にオブジェクトを入れていくというのも、何となくわかっていた。
9. Scene.contentは先に入れた方が下になって表示されるのは動かしてみて一目瞭然だったが、zオーダのようなレイヤというか重ね位置制御が出来るのかは知らない。zオーダはVBから来ている知識。

(2010.9.26追記)zオーダではないが、deleteしてinsert after(またはbefore)を使えば近いことができるかもしれない。実際に試してはいない。公式チュートリアルにて。順番はともかく、シーケンスに入れたり出したりしようと思っていることがあって、ここに追記しておく次第。(2010.9.26追記)

とか、細かいことで、

10. Timelineはplay、pauseで実行(動作)を制御できる。
11. keyFrames: [at(0s) { var1 => 90; var2 => 0 }]みたいな省略記法がある。
12. JFileChooserは難しいことをしなければ恐ろしく簡単に使える。

などがあった。

※1 いろいろbindについてはこちらの記事が非常に詳しい。ありがとうございます。バウンド関数やオブジェクトのbindの注意事項(毎回インスタンスが生成される)など、VideoCubeでは見えてこない話も満載。特にMVCという観点からbindの必要性、重要性を説明されている点は見逃せない。MVCやデザインパターンとはできるだけ距離を置きたい派※2な自分にも結構効く。

※2 というよりプログラミングと距離を置きたい派

VideoCube 11

ところで、O3D。demoを見たが、CPUの負荷がとても少ない。と思っていたら、WebGLと統合? X3DのサイトでX3Demoを見ようとすると見れない。ついていけない。まあどうせ今見る話じゃないし。

でもHome Designer Demoとかinfinite journey Demoとか Beach Demoとか、どれもすごいので、なくなるのはもったいないと思うが、そのままそう簡単にWebGLに引き継がれるものなのだろうか。

それにしてもこれらデモ達のキビキビした動きを見ると、どうしてVideoCubeはCPU100%近くまで行くのか、すごい不思議。

PerspectiveTransformの四隅の位置。
def pt = PerspectiveTransform {
ulx: bind d + ul.x
uly: bind d + ul.y
urx: bind d + ur.x
ury: bind d + ur.y
lrx: bind d + lr.x
lry: bind d + lr.y
llx: bind d + ll.x
lly: bind d + ll.y
}
dは2rだが、Faceの四隅をdにしているので、d/2ではないか?と思い、d/2にしてみると、左隅によってしまった。あれ? よく見ると、Faceを初期化する際のxの位置が-r〜rになっている。なるほど、中心が原点か。つまりdを足すというのは、左端から中心(原点)までの距離を足すということ。なるほどね。dが何の略か分からないのでピンと来ないが、sceneに対して余白と考えると、どうもしっくり来ない。それにbindにこんな固定的な足し算を入れるのはどうなの(速度というより無駄な気がする)。でも他に方法ないんじゃない?どっかで足さなきゃいけないんだし。あ、Faceの初期化でdを足しとけば良いのか。いやそれは無理。Faceの初期化で渡すのはPointだから。かといってPointの座標を変えようにもうまくいかない。やはりbind時にdを足すで正解なのか。

だいたい分かってきた気がする、と思ったら雨、雨じゃないか。嬉しいような嬉しくないような事情もあり。

分かった事を整理して、この中でJavaFX的に何がわかったかを整理しよう。

1. タイマによる定周期処理
Timelineクラスの変数を定義して繰り返しを無限(repeat:Timeline.INDEFINITE)、時間に周期を設定(time:40ms)、アクションに処理を書けば(action:function() {})実現できる。

2. マウスイベントハンドラ
onMouseClicked:function(event) {}で書けば良い。今回はPolygonに書いているが、書けるクラスは色々あると思う。また、重なっている場合の順序については良く分かっていない。CustomNodeの場合は、単純にcontentにセットする順番で最初に記述したものが下にくるようだ。Polygonを最後に書くと真っ黒になる。だがMouseイベントはどうなのか。Polygonが最初の場合でも受けているのは、なぜか。と思って色々場所を動かしてみると、なんと、最初のGourpの直下でないと受からない。これが仕様だとは思えないので何か書き方の問題なのだろうが、はて何だろう。

いろいろ調べていると、JavaFXのチュートリアルにGroupにonMouseEnteredを書いているところが。あれGourpに書けるの? そうすると範囲はどうなるんだろうね。中の要素全体かな。とにかくGroupにonMouseDraggedを移動してみると、おお確かに利くじゃないか。しかもPolygonに入れたときは、動いてる方向と逆側にドラッグすると中心付近で止まってしまい、一旦マウスボタンを離してからじゃないとドラッグが利かないのに、そんな突っかかる事も無く、かえってスムーズに動いてる感。

どうでもいいけど、色々いじったせいで、コードがぐしゃぐしゃになってしまった。

あ。ドラッグしたまま(当然マウスボタンを押したまま)にして、そこからちょっと動かすと、突然マウスポインタが手から矢印に戻ってしまう。ドラッグも終了してしまう。なぜか。元に戻してみると・・その前にblocksMouseがfalseだったのでtrueに戻してみると・・変わらない。

反対側にドラッグしたら利かなくなるというのは、おそらくこのドラッグが終わってしまう現象だったのだと思う。結局、

(1) Polygonに付けても、Gourpに付けても、マウスイベントの動きに差はなさそう。
(2) ネストしたGroupのcontentのオブジェクトのマウスイベントは何故か拾えない。
(3) ネストしたGroupにマウスイベントを貼ったらどうかというと、やっぱりダメ。

実はmacだからだったしりて。blocksMouseも関係なし。まとめようとしていたのにぜんぜんまとまらなくなってしまった。

でもネストしたからというのは考え難いので、いろいろ取っ替え引っ替えやってみると、ほら、やっぱり単純にTextをGroupのGroupに入れただけならマウスイベントは取れる。

もしやと思ってPerspectiveTransformを外してみると...当たりだ。というか、断定するわけではないが、PerspectiveTransformをCustomNodeのcontent内のオブジェクトのeffectにセットした場合マウスイベントが拾えない状況で、effectをはずすと拾えるようになる。

PerspectiveTransformのAPIリファレンスを見ると”containment methods are undefined”とあるが、単にGroupにTextを入れて、TextのeffectにPerspectiveTransformしても、Text内に入るとカーソルがちゃんと(ハンドに)変化する。ところがCustomNodeに入れたGroupで同じことをすると全く変化しない。

ネストがダメなはずはさすがにないだろうと思ったが、やはりそんなことはないようで、その点はとりあえず良かった。

VideoCube 10

Pointについての確認。

実際のPointの定義で正面側を裏面側にbindしているので、rotateX/Y/Zは正面側だけになっている。bindで裏面側が変化する。正面と裏面の関係は常に正面のマイナスが裏面だが、それでいいのかというのが微妙だが、何となく良さそうな気がする。

もう一度正面と裏面の関係をイメージするため実行してみると何故かエラーが。金槌に刷毛マークのアイコンをクリックしてクリアしてみると解消した。解消してしまったのでエラーが何だったか分からなくなってしまった。しょうがない。

実行してみると、なるほど、前面と背面はz系はちょっと分からないが、何となく対角線上に表と裏が位置しているように見える。問題はそのギャップ、距離。これがzとの関係になるのだろうが、例えば分かりやすい真横を向いた場合、正面が左で裏面が右だとしよう。そうすると距離はちょうど面の(1辺の)長さ分になる。これがzだと思うのだが、二次元上のzがどう展開されるのか、さっぱり。3次元で考えると、サイコロは円運動しかしていないので、変化しないようにも思えるが、いずれにしても最終的には2次元上のx,yを決める必要がある。

でも結局描くのはPerspectiveTransformだと思うので、四隅の座標がzと絡んでどう変化するか、ではなかろうか。そうすると、
ulx: bind d + ul.x
(以下同様)

のようにdの位置にxを足しているから、dがzに絡んでいるはず。

ここで結局Webで調べることにした。3Dグラフィックスでググるといろいろ出てくるが、VideoCubeは平行投影というセオリーのようだ。回転についてもいくつか情報があるが、いまひとつピンとこない。だがまあ、ここで今悩んでいてもしょうがないので、そこは飛ばして、そういう計算式をJavaFXで実装する、ということに留めよう。

なぜ先に調べなかったのか悔やまれる。図形問題が気になる性質からだと思う。何事も勉強だ。だが開き直ってないでしっかり反省したい。

ということで、rotateX/Y/Zのうち、Zは使わない。X/Yについては、平行投影の場合の常套手段のようだ。といいつつ、何か決定的な文書が見つかった訳ではないが、ActionScriptの記事を見て。ありがとうございます。

2010年8月11日水曜日

VideoCube 9

何故か分からないが、この(Faceの中の)Groupの塊の中で、PolygonがMouseイベントを受けている。サイコロとしては一体なので、そもそもFaceで受けるというのは、その面をどうにかした(操作した)という意味だろう。だが、感覚的に3Dオブジェクトであるサイコロを回転させるという操作は、サイコロの外でマウスというよりジェスチャーで動きを指示しているイメージがある。もしかしたらそういう風にもできるのかもしれないが、回転させた面を書き換えるのと、サイコロ全体を書き換えるのの違いが分からない今としては、何とも言えないところ。とりあえず今わかっているのは面がonMouseClickedとonMouseDraggedを受けて、角度の変化を見て、cxとsxを(bindを通じて)書き換えておき、これをTimelineを通じて40msで(回転角があれば)rotateX//Yによりサイコロの8つの頂点を回転させるらしいということ。ただ今の時点では、rotateX/Yの中身が分かっていないので、8つの頂点を回転させるという処理自体も意味を分かってないし、PerspectiveTransformの効果と合わせて、サイコロが回転しているように見える原理がまるでワカランチンだ。

そもそも見た目3Dなので3Dで考えてしまっていたが、(ここから飛行機内で分かったこと)サイコロはあくまで2Dで描画されるのだと思う。で、サイコロが回転すると、2D的には変形することになるが、それを各面のPerspectiveTransformを使って実現している、と。

だとすると、その変形は結局2方向の成分の合成で求められると思う。つまり正面から見て前後に回転する場合、正面にある四角は徐々につぶれて行く。つまり、縦の長さが短くなって行く訳だ。また、この動きを真横からみると、円運動になる。つまり、面を斜辺とした三角形の回転と考えればわかりやすい。例えばサイコロを30度後ろにそらすと、横から見て、初め面は垂直だったのが、垂線から30度、水平線からは60度傾いた斜辺となり、それによる直角三角形の高さ部分が正面から見えている領域ということになる。だから更に後ろにそらして行くと、やがて水平になるが、このとき正面から見える面が全くなくなる。その後さらにそらしていくと、逆さになるが、正面からサイコロを見るという場合においては、裏側に行ってしまうので、この状態でも正面からは見えない状態になる。そうして一周してくると、徐々にまた見えだしてくるが、このとき見える領域は、マイナスの高さ分になるが、量としては最初と同じような変化になることは言うまでもない。

さて、こうしてみると、正面からみたサイコロの正面の面の見え方は、正面の面を斜辺とし、θを回転角とする直角三角形におけるcosθで表される事になる。もしサイコロが縦方向にしか回転しないのであれば、このcosθを高さとしてPerspectiveTransformすれば、正の高さを持つ間に関しては、単純に描画されると思われる。あとは裏側に行った場合にどうするか。他の面がそり上がってくることで、描画の重なりをうまく考慮できれば、常に最前面にそり上がってくる面が一番上で描画され、他は隠されると思われる。もっとも、隠されたときに無駄な描画が発生しないことも重要である。

ここまで来れば、あとは全ての面について、合成すれば、万事サイコロが書けるはず。ということは、そういうふうにVideoCubeはやっているのではないかと。

移動した量を角度としてどう算出するかは、マウスの移動量をどう角度に結びつけるかという、ある種決めの問題だが、実際の動作との兼ね合いで決めて行くしかない。VideoCubeは少なくともマウス移動の加速度や移動量から回転速度が変わるような高度な動きはしていないので、現状を理解すれば、その先の展開上の問題にあがるかもしれない。

だが、PerspectiveTransformは面にしかかかってないので、サイコロ全体を鳥瞰しているわけではない。3D的にはサイコロ全体に対してかけたいが、これはどうしたらいいか、分からない。とまた前述の3Dの話に戻るので止めよう。ここではPerspectiveTransformが各面に対して利いているだけで、またVideoCube的にはそれでOKになっているということだけ念を押して理解しておくこと。
onMouseDragged:function(event) {
ax = if (-5 < event.dragY and event.dragY < 5)
then 0 else - event.dragY/10000;
ay = if (-5 < event.dragX and event.dragX < 5)
then 0 else event.dragX/10000;
}
-5〜5なら0、それ以外は1万で割る。随分大きくでたねぇ。axはMath.sin(ax)となるのでラジアンである。ラジアンって360度で1?(2010.8.12追記 2πだから約6.28)まいいや。いま機中なのでWebに繋がらないから後で調べる事にする。何れにしてもドラッグ量から回転角を出すだけなので、この辺は感覚の問題でもあるし。

VideoCube 8

class Point{}

これは自前クラスだと思うが、なぜrotateXのパラメータが勝手にdoubleになっているのか。戻りも勝手にfloatになっているのか。秘密はrotateX(cx,sx)だと思う。この呼び出しを含め、すべての呼び出しのパラメータの型がすべてdoubleになっているから。これがひとつでもIntegerだったらエラーになると思う。IntegerはOK!? StringはNGだ。だがエラーメッセージがdoubleじゃないと言っている。つまりdoubleだと決めつけた上でエラーだと言っている。しかし変更したのは最初にrotateXが出現する場所である。なぜStringをデフォルトで採用しないのか。不思議だ。

VideoCube 7

以前、ブロガー諸氏のブログを書くためのツールに関する記事を読んだことがあった。そのときいろいろ探して結局断念した記憶がある。経緯は忘れた。だが結果がそうであるのだから、きっと何か、おそらく自分で作った方が的な考えでボツになったのだろうから、今回またちょっとそんな(ツールほしい)気になったからといって、どうにかするつもりはない。だから当面、今まで通りBloggerの素晴らしい標準エディタにお世話になろうと思う。

OpenOfficeには色々書いたが、読み返すと疲れることが多いので、ところどころ割愛していく。またどこで区切るかは、区切りを入れてなかったのでまったくの適当。

Faceについて見て行く。

わかるところから。

def animate = bind z > 0 and error on replace old {
if (animate != old) {
if (animate) {
animation.play()
} else {
animation.pause()
}
}
}

普通変数というと、何か状況に応じて設定されて、後で条件判定されたり、計算結果として保存されたりするものだが、このanimateという変数は、単にon replaceを掛けるための物と言って良いと思う。つまりz>0 and errorが変化したらplay()かpause()をしたいのだ。一見animateのif文は冗長にも見えるがこれはしょうがないところか。bindにしろ、on replaceにしろ、変化点で処理が出来るのは基本的好都合。すばらしい。

createで Faceの要素が作られるようだが、大まかには、
Group
|-- Polygon( PerspectiveTransform )
|-- Group( PerspectiveTransform )
|-- Rectangle
|-- Circle
|-- Circle
|-- Circle
|-- Circle
|-- Text
|-- Line
|-- Line
|-- Arc
|-- MediaView( PerspectiveTransform )
のようになっていて、GroupとMediaViewには、Faceを生成する際に指定されたPointによる PerspectiveTransformがeffectにより対応付けられる。Polygonの場合は、Polygon.pointsというポリゴン自身の頂点自体にPerspectiveTransformの頂点がbindされる。もちろんPolygonの頂点は4つ。これで単純に疑問に思うのは、最初のGroupのeffectにPerspectiveTransformしていない点。おそらくPolygonにうまく利かないのかもしれないが、試しに実行してみればわかるだろう。ただPerspectiveTransformはもっと複雑な鳥瞰による模型の場合、例えば部屋などで、部屋全体にPerspectiveTransformを利かせられないとしたら残念である。ただ私はまったくその辺のCGの基本概念がなってないので、御託を並べてるにすぎない。

Textはいいとして、円が4つ?線が2つ?これはなんだろう。そしてArc。これはくるくるの正体だからいい。もう一度実行して確認してみよう。なるほど、円が4つで二重線のような枠線になっているのか。直線は十字に引かれてる。Rectangleは面と同じ四角。非表示にすると面は真っ黒になるが、四角は保たれる。これはどこから来ているのか? 色がforeground変数にbindして設定してある。代入でも良いと思った瞬間なるほど、bindなら後で色変更を追加したとき、foregroundを変更すれば、全部自動的に変わるわけだ。この辺は非常に分かりやすい典型的なbindの効果かな。素晴らしい。

Lineもstrokeにforegroundをbindしている。が、どうしてTextやRectangleはfillでLineはstrokeなんだろう。

ところでcontent:にRectangleやCircleなどをどやどや入れて行くのは良いが、後からそのインスタンスにアクセスするにはどうすれば良いのだろうか。初めから変数に入れておけば良いのだろうが、それでは面倒だから、何か直接アクセスできる方法がきっとあるのではないかと思われる。

VideoCube 6

このブログはメモ帳として使っている。普通のファイルだと何処に置いたか分からなくなるからだ。だが、書いている途中で書き込みエラーになるのは頂けない。それでもエラーなんだからしょうがないのだが、時として前回保存できたところも一瞬消えることがある。一瞬というのは、エラーの後同じ記事を編集しようとすると、だいぶ前に戻ってしまっていたのに、ブラウザを開き直したか何かのタイミングで復活してきたのだ。結果としては良かったわけだが、今度同じことがあったらと思うとちょっと考えてしまった。とりあえず、暫くの間使うMacは同じなので、ローカルなファイルに書いてからブログにアップしてみようと思い、OpenOfficeでせっせとメモっていた今日この頃であった。それと珍しく飛行機で7時間もヒマだろ〜ということもあり、ローカルで保存する必要があったこともタイミング的に重なった。

ところがOpenOfficeで書くと、ブログのようなルーズな感じがなく、メモだかなんだか分からなくなってしまう。もっとライトで馬鹿丸出しのメモでいいのに。

といってもせっかくVideoCubeは何となく理解出来た気になったところまで書いたのだから、アップしよう。

2010年8月9日月曜日

Googleマップが5歳に

Googleマップは5歳になりました

おめでとうございます。いつもありがとうございます。愛用しています。

さて、5歳といえばうちの犬と同い年である。なんかもっと古くからあるような気がするが、まだ5年なんだ。うちの犬と同い年ということは、GlassFishとも同い年ということだが。あまり関係ないか。

何より感心したのが5周年を記念してベータ版から正式版になったということ。そういえば1年ぐらい前だろうか、何か他にもベータ版が正式版になったものがあったと思ったが、失念した。

輝ける永遠のベータが一つ消滅した。

まだまだベータとしてやるべき事は沢山あったのではないかと思うにつけ、残念といえば残念である。新たなベータとして3Dマップなベータサービス(そんなものあるか)に期待したい。O3D(WebGL)なら軽々出来そうではないか。3D化が実現したら、ディズニーランドやシーも再現してレストランやお土産屋さんのレジの混雑状況やアトラクションの待ち時間表示、ファストパス発行なんかが出来るようになるといい(無論公式サポートによる)。他にも六本木ヒルズやビーナスフォートなど、迷子になりやすいモールがマップでリアルに表現されれば、店舗情報も去ることながら、現在位置や友人の位置なんかがすぐわかるようになって楽しい。本当はこっそりそういうアプリを作ろうと思っていたが、車ナビや歩きナビの連携など、例によって激しく赤方偏移を繰り返すうち、ほとんど無色になりつつあるので、お祝いに。もちろん3Dでなくともデフォルメされた2Dでさえ役に立つだろう。言うは易くという向きもあろうが、以外とそうでもないと思うので、ひとついかがだろうか。

2010年8月5日木曜日

タイ

ブログを書くのは大変だ。早くも2ゴールを放ったラウルのメモを残したいが、ままならない。とりあえずはてぶにyoutubeしたのでそっちを見ること。例によってラウルらしいこぼれ球の押し込みとヘンテコだけど入ってしまうループ。まさに名刺代わりの2発。

タイは雨。自慢のDP2を使う機会がなかったので、iPhoneで軽くスナップ写真を。トゥクトゥク撮らないとまずいんじゃない?と言われたので頑張って撮った。本当はデコトゥクを撮りたかったが、今度観光で来る機会があったら。それまで残っていることを願っている。他にもシンガポールでマーライオンと2台蛇腹で連結した赤い路線バスを撮りたい。

時代に取り残されるTUKTUK
<br />時代に取り残されるTUKTUK
時代の波に飲み込まれるTUKTUK
時代の波に飲み込まれるTUKTUK
他にもMLBのBeat the Streakとtotoboat、VideoCubeなど、いろいろメモしたいことがあるが、そっちはとりあえずローカルなOpenOfficeに。

2010年8月2日月曜日

シンガポール



ほんとこういう時用に、ちょっとした三脚がほしい。
地面に置いてもアングルを持ち上げれば多少は撮れるので。
とりあえず意地で数枚撮影。

まだまとめ切れてないが、飛行機で気圧が下がったせいで脳が膨らんだ(表面積が大きくなった)せいか、三角関数というか、VideoCubeの(自分における)謎がかなり解けた。

とはいえ、エコノミーの真ん中は辛い。トイレに行くのが大変。帰りは水分を控えよう。