2011年12月30日金曜日

Xcode 4.2 でstoryboardがXML表示から復帰しない

散々悩んだ挙げ句、再起動してみると、再起動時にエラーになり、continueを選んで(エラーを無視して)起動したら治った。というか、そもそもstoryboardをXMLで表示するモードがあるのか、なぜ突然XMLで表示されたのかも分からず。

(追記2012/6/22) storyboardのファイルの右メニュー→"Open As"→"Source Code"でXML表示になる。"Interface Builder - iOS"でレイアウト表示に。

Xcode 4.2 から tabbed applicationのtab barのitemを増やすことが出来なくなったみたいだが、マニュアルにもライブラリからドラッグしてくるとあるので、それ自体バグなのかもしれない。4.1に戻せるか、やってみよう。

2011年12月27日火曜日

iPhoneでJavaFXを動かすマジック その3

果てしなく道は遠い気がしてきたが、さてどうしたものか。Webkitで動かしても何の意味もないしなあ。何故かというと、Webkit(HTML5)では今今出来ないことをやりたいので。

あ、それから忘れていたが、AppStoreを通すことは全く考えていないので、あまり動きに制約めいたものは考えない。考えていないというとウソになるのだが、それはまた後で考えればいいと。最終的には通すことを考えるし、ある程度考えてはある。ただそうした制約めいたものは”今”は切り離す。

取りあえず先にiPhoneでLogin画面を表示してみっかな。

iPhoneでJavaFXを動かすマジック その2

(まずは休憩から)

休憩しながらいろいろ考えたんだが、FXMLLoader自体、ローダーって言っているところが気に入らない。まず、DOMのようなFXMLオブジェクトであるべきじゃないか。ただその為には、ある種GUIがFXMLと等価でなければならない。それはちょっと無いんじゃないの?と、安直には思いたい所だが、FXMLのドキュメントとしての価値を考えた場合、言い換えればそれがFXMLである必要はまるでないのだけどもJavaのコンテンツだと考えた場合、ある種のアクティブなドキュメントである必要があるのではないか、あるいはそうあってほしいと思う。

欲しいといっても自分が願っているわけではないという、矛盾もあるのだが、それはまだWebが商用サービスとしては(少なくとも日本では)なかった時代から、システム開発を行う自分たちの間で求められて来た(JavaやJavaFXとは無関係なところで)『動くドキュメント』という概念があるからとも言える。

なんて言っていたら案の定、あらぬ方向に文字が走ってしまったので全カット。要するにFXMLLoaderでいいか悪いかは置いておいて、自分が何をしたいのか、それがFXMLで可能なのか、あるいは他のXMLにした方がいいのかも含めて、ちょっと別な紙に書いて整理しよう。ここに書くと多分書ききれない。

そうだ、取りあえずサンプルが動かない原因で試してみたいことがあったのでそれだけやっておこう。怪しいreplaceSceneContentのオリジナルのコードはこう。


FXML-LoginDemo.jarのApp.javaのAppクラスのreplaceSceneContentメソッド

    private Parent replaceSceneContent(String fxml) throws Exception {
        Parent page = (Parent) FXMLLoader.load(App.class.getResource(fxml), null, new JavaFXBuilderFactory());
        Scene scene = stage.getScene();
        if (scene == null) {
            scene = new Scene(page, 700, 450);
            scene.getStylesheets().add(App.class.getResource("demo.css").toExternalForm());
            stage.setScene(scene);
        } else {
            stage.getScene().setRoot(page);
        }
        stage.sizeToScene();
        return page;
    }

sceneがnullじゃないと、setRoot(page);でお茶を濁しているが、これをやめて毎回sceneのインスタンスを作ったらどうなるか。

            //stage.getScene().setRoot(page);
            scene = new Scene(page, 700, 450);
            scene.getStylesheets().add(App.class.getResource("demo.css").toExternalForm());
            stage.setScene(scene);

ほら、動いた。profileの画面が表示され、右上のlogoutをクリックすると、元のlogin画面に戻る。
だが、次のコードにしてstage.setScene(scene);だけにするとやはり動かない。

            //stage.getScene().setRoot(page);
            //scene = new Scene(page, 700, 450);
            //scene.getStylesheets().add(App.class.getResource("demo.css").toExternalForm());
            stage.setScene(scene);

他にも追求しようはあるが、面倒なので止めておく。

2011年12月25日日曜日

iPhoneでJavaFXを動かすマジック その1

ここからはほとんどライブログ。
[12/26追記]のつもりだったが全然進まない。

まずiPhoneでJVMを動かすわけではない。あくまでマジックなのでトリックがある。普通マジックはネタばれしたら意味ないのだが、トリックとはFXMLを使うというもの。write onceでrun iPhoneするのだ。それだとJavaFXアプリとは言えないが、まあご愛嬌。

ではさっそくググってみる。

"javafx fxml"

まず本家本元、開発者ブログ「FX EXPERIENCE」のエントリ『introducing FXML』から、PDFを読んでみる。

と、ちょっと飽きて来たので、フライングして気になっていたactionをPDF内を検索するとp11に"onAction"が見つかった。なるほど、こんな風に書けるのか。とすると、やはり当たり前だけどアクションを追加しようと思ったら、コードを追加しないと行けないのか? それともこの先に、それを軽減する技があるのか? と思ったらそのすぐ下Scriptingと題してFXMLの中にコードが埋め込めるじゃないか!

で、そこに、


"Any JVM scripting language can be used, including JavaScript, Groovy, and Clojure, among others."(該PDFより引用)

とあり、実際、その下のほうにJavaScriptによるサンプルコードも載っている。

(ここで喜楽亭休憩&ガソリン満タン)

(ここでさらにケーキ休憩。まったくライブ感が無くなってしまった)

そういえばFXMLLoaderで読み込みはできるが、保存はどうなんだろう。Ensembleで探してみるが、サンプルがない。それに右上の検索窓には「Samples and Docs」とあるが、どうもSampleしか出てこないっぽい。しょうがないので、DocumentツリーからFXMLLoader辺りを選んで見てみる。が、さすがにこれを一瞬で読み取るのは難しい。とりあえず検索できる環境でドキュメントを開こう。確か前に、

 (ここで寝る)


2011/12/26
javadocがnetbeansでなかなかうまく表示できないのに頭がついて行けず固まってしまった。まずNetBeansがBetaだった!ので消す。これはEnsembleでprojectを保存したとき、勝手に起動してくるのだが、それがBetaだったのを知ってか知らずか、そのままにしていたのだが、RC2があるので単純にそっちにしてみようというだけ。
(あ...最悪だ。ここから先の編集がぶっとんだ。一体自動保存はどうなっているんだろう? もうどうでもいいか)

RC2だとJavaプラットフォームの設定が適当にされすぎてビッくりしたが、そこを手で直してやったらちゃんとFXMLLoaderのjavadocが表示されるようになった。で、書いたのがぶっとんだので要点だけ。FXMLを保存したいが、保存してくれるAPIが無い、もしくは見つからない。FXMLドキュメントを作りたいのだが。しょうがない、取りあえず自分で書くか。それまで保存は無しで(なんという開き直り)。

(2011/12/27追記だけど12/26の作業) genericsを調べる。何となく型パラメータという認識でいたが、developerWorksの記事で余計混乱する。が、まあ、ほっとこう。

なんだかんだで、JavaFX2.1のsampleのFXML-LoginDemoをデバッガで追いながら動きを追ってみる。なんかこうダイアグラムでトレースしてくれるといいんだけどねえ。自動的にトレースログ埋め込みコンパイルオプションとか、無いんだろうか。およびそのビューア(何千回もループするようなログは見たくないので適当に端折ってくれる便利な奴。ログからフローチャートに変換してツリーで表示、かな。あ、作ってみようかなもし無かったら)。

とりあえずブレークポイントを張りながら動かしてみると、ちゃんとブレークして嬉しい。というのは、如何に今までブレークしない環境でのデバッグ経験が豊富かということの裏返し。ROM焼き一発勝負っていうのもあったよねえ。

login.fxmlのほうは表示されて、login=demo、password= demoを入力すると対応するonActionのdemo.loginController#processLoginにエントリして、profile.fxmlを表示しようとしているっぽいんだけど表示されない。replaceSceneContentには行ってるんだけど、stage.getScene().setRoot(page); が効いてなみたい。

(ここはBloggerの話)
やっぱり自分の操作ミスじゃなかった。保存してから公開したら、古いものが公開されて保存に戻す、も効かない。さっき書いたのは消えてしまった。docomoのspモードか? これはもう書くなという啓示に等しいw とりあえず戻って26日の分をmemoる。

 (それにしてもBlogger、この恐ろしい無関係なspan入れまくりのプログラム、どうやったら書けるの?w)

2011/12/27
次のエントリへ。

JavaFX 2.1 Developer Preview for Mac

JavaFXが2.1になった。

http://docs.oracle.com/javafx/2.0/release_notes_mac/jfxpub-release_notes_mac.htm

12/24に気づいたので、ちょっとしたクリスマスプレゼント。さっそくEnsembleを動かしてみるとXylophoneが動いている!

2.0の頃は「お前のグラフィックスはもう古い。」とお前はケンシロウか!節を炸裂させていたが、この通りキチンと動くし音もでる(そのうちJPEGの中にMP3を埋め込む気)。


ケンシロウが入っていた2.0



実は音も出る2.1

1.xから2.0への隔たりが大きかったので、これまでJavaFX2.0と言われてきたが、2.1になった以上末尾の数字はあくまでバージョン標記なのだが、Java SE 7とか言うことを考えれば、JavaFX 2 というべき? でもJava SEは 7.1とか上がらないわけだから、面倒だけど2.1とか言うべき? まあ悩むところじゃなかったな。悩みすぎて寝てしまった。

さて次はJavaFX2.1で書いたコードをiPhoneで動かす!マジックに挑戦しよう。

2011年12月18日日曜日

memo 2

memoが一杯になったのでmemo2を作った。本当はもういいかなと思ったのだが、マックのダブルチーズバーガーの薄さというか、写真とのあまりの違いに、マクドナルドのハンバーガーをいくつか、実際にバラして重さを計ったりしてみようという企画をそのうち書いてみるつもり。

そもそも愕然としたのが、月見バーガーで、あまりの酷さ〜すなわち実物と写真とのギャップに我慢ならず、マクドナルドにクレームのメールを出したのだが、しれっとした返事が帰って来ただけだったこと。これがマクドナルドのような巨大企業がやっていいのだろうか。これが正義なら、何をやっても大概許されるだろう(そう、このエントリも)。

確かに商品サンプルは誇張される傾向にある。だが、事実と明らかに違う写真は、実際には詐欺だろう。写真と違うと言えば、1人ぐらいなら返品に応じるかもしれない。しかしそんなリスクは折り込み済みとでも言われそうだ。かといって集団で行動を起こせば、営業妨害に取られかねない。なんせ膨大な利益と雇用を生んでいる日本を支える企業だ。そんな企業の不利益を見過ごすわけにはいかない、と行政が思っても不思議は無い。しかも痛いのは返品しても自分はぜんぜん嬉しくない。ただ手間と時間と気分を損するだけ。

例えばハンバーガー1個当たりの法人税が1円だとしよう(この数字は計算の為のいい加減なものなので注意)。そうするとハンバーガー1個売れれば、1円納税される計算になる。めざせ!100億個! もし収税係がそう思いたくなったとしても無理は無い。その為には、多少事実と違う宣伝がされたぐらいなんだ? 宣伝広告費で他の会社だって潤う。只でさえ経済が苦しいこの世の中、みんなで支え合っていかなきゃダメじゃないか、と言われて、如何にも不味そうな見た目そのままの写真しか使えなくする理由は、大義名分ですらなかなか思いつくものではない。

だが実際、マクドナルドは以外とうまい。物事外見だけじゃないよ、中身だよ。あの写真はそれを伝えようとしている。

をっと、これがオチだと思ったら大間違い。街頭アンケートを取って誇大だ、是正しろという声が多ければ、公正取引委員会に持ち込んで、何とかすべきじゃないか?を毎週言い続けられるようなメールを送れるWebサイトを作ったらどうかと思う。あ、そっか。Webでアンケートを取って、それが過半数を超えたらクレームのメールを送るようなシステムにすればいいのか。個人情報はサーバには保存せず、メールは暗号化して送ればいい。