複雑なアニメーション(GroovyFX版)

id:skrbさんがJavaFXでのアニメーションについて
複雑なアニメーション - JavaFX in the Box
というとても勉強になる記事を書かれていたので、同じアニメーションのGroovyFX版を書いてみました。*1GroovyFXには、シーングラフの構築だけでなく、タイムラインの記述も簡潔にできる機能があり、この例ではそれがかなり役立っています。

"cut here"のところで切り取れば、いま話題(!?)のGroovyFxPadにコピペして実行することもできます(上図)。GroovyFxPadで実行すると、いろいろなパラメータを変えながら動きを見ることができ、なかなか面白いものがあります。GroovyFxPadについては、id:kimukou_26さんやid:orangecloverさんの下記の記事が参考になります。

*1:できるだけオリジナルに忠実に書きましたが、微妙な違いもあります。また、GroovyFXPadにコピペしやすいように少し構造を変えています。

GroovyFX 初の正式リリース(翻訳)

原文: Pleasing Software: GroovyFX First Official Release

http://2.bp.blogspot.com/-HSzaJlyitE4/T1OwmQKBttI/AAAAAAAAAZs/0uoERu-x7gI/s200/helloGroovyFX.png

GroovyFX v0.1が、Mavenのセントラルリポジトリから、またはGroovyFXのwebサイトから直接バイナリJarファイルとして(「Community」の下の「Download」リンクか、あるいはここをクリック)入手できるようになりました。このリリースはJavaFX v2.0.2と互換性があります。

GroovyFXをJavaFX v2.1開発者プレビュー版と一緒に使う必要がある場合には、GroovyFX v0.2のスナップショットを使う必要があります。このポストの後半部分でその例を示します。

Grab対応

GroovyFXがMavenセントラルにあることで(SonatypeのOSSホスティングのおかげです!)シンプルなテストから大きなプロジェクトまで、どんな場面でもGroovyFXを簡単に使えるようになります。GroovyのGrapeシステムの一部であるGrabアノテーションを使った、次のシンプルなスクリプトを考えてみてください。

このスクリプトは、以下のようにしてコマンドラインから簡単に実行できます

groovy -classpath $JAVAFX_HOME/rt/lib/jfxrt.jar helloGroovyFX.groovy

プロの小技:GroovyFXプロジェクトのフェロー・メンバであるDierk Königは、どのGroovyスクリプトでもJavaFXライブラリを利用できるようにする、以下の小技(このページでも説明されています)を提案してくれました:

mkdir ~/.groovy/lib
ln -s $JAVAFX_HOME/rt/lib/* ~/.groovy/lib/ 

これで次のようにタイプできます:

groovy groovyFXHello.groovy

プロジェクトのビルド

GroovyFXは、次のGradleスクリプトで示すように、単にビルドファイルの依存関係にそれ自身を含めることにより、より大きなGradleMavenプロジェクトの一部になることができます。

このビルドスクリプトは、JavaFXライブラリを見つけるためにJAVAFX_HOME環境変数を使っています。また、MavenセントラルリポジトリにあるGroovyFX 0.1への依存関係を宣言しています。

さらに、Dierk考案のmakeDirsタスクも取り込んであります。このスクリプトをプロジェクトのルートディレクトリにコピーしておけば、gradlew makeDirsを実行して、src/main/ や src/test といったディレクトリを含んだ、標準的なMaven/Gradleのプロジェクト構造を作ることができます。

次に、前述のGroovyFXのHello Worldスクリプトを src/main/groovy ディレクトリにコピーします(ここでは、Gradleビルドスクリプトの中でGroovyFXへの依存関係を明示的に宣言しているので、@Grabアノテーションは削除します)。そしてgradlew clean runを実行すれば、プロジェクトがコンパイルされ、実行されて、このポストの冒頭に示したウィンドウが表示されるはずです。

Mavenスクリプトは自虐的な読者の方への課題とします。

GroovyFX 0.2-SNAPSHOT の利用

最新のJavaFX 2.1開発者プレビュー版と一緒に使いたい場合には、最新のGroovyFX 0.2ライブラリのスナップショットを入手する必要があります。Sonatypeのリポジトリには、最新の0.2に対応したスナップショット版もあるので、前述のGradleビルドスクリプトを以下のように変更すれば使うのは簡単です。

ひとつ注意すべき点は、GroovyFX 0.2ではスタートアップの構文が少し変更されたことです。SceneGraphBuilderを明示的に生成する必要はなくなりました。これは自動的に生成され、delegateとしてstartクロージャに渡されます。以下のスクリプトは、GroovyFX 0.2と互換になるように修正したHello Worldの例です。

以上です!ぜひこの新しいリリースを試して、問題点改善提案などをお聞かせください。

Groovy 1.8.4 & 2.0-beta-1のリリースと今後のロードマップ(翻訳)

原文: http://docs.codehaus.org/pages/viewpage.action?pageId=227053189

本日、新たなジョイントリリースのお知らせをできることを大変うれしく思います!

Groovy 1.8.3における、Grails webフレームワークやGradleビルド自動化ツールでの問題点の修正や改善を含む、Groovy 1.8.4をリリースしました。
さらに、Groovy 2.0-beta-1のリリースもあわせてお知らせします!

Groovyのバージョン番号体系の変更

そうです、Groovy 2.0ベータです!え?1.9系を進めていたはずだろうって?確かにそうだったのですが、1.9リリースではかなり多くの新機能が盛り込まれるため、この機会に番号体系を改めることにしました。

歴史的には、Groovyの「メジャー」バージョンはずっと「ドット」バージョンでした。これはこの業界ではちょっと異例で、普通はメジャーバージョンは新しいメジャー番号を持つものです。Groovyのバージョン番号体系は、外の人や新たにGroovyを始める人からは少し奇妙に思われてきました。また、マーケティング的観点では、もし1.10バージョンをリリースすることになった場合、辞書的に逆順(数学的にも1.10 < 1.9)になってしまうという問題があります!バージョン番号の大きな変更は初めてのことというわけではありません。Groovyは1.1から1.5になりましたし、最近Grailsも次期メジャーリリースを1.4から2.0に変更しています。

そんなわけで、いつまでも実現しそうにない神話的な "2.0" バージョンではなく、次のメジャーリリースが 2.0 になります。その後は、たぶんいつも通りいくつかの2.xバージョンをリリースするでしょう。そしてメジャーバージョン番号を持つものについても、ほぼ毎年1つのメジャーバージョンをリリースするという、これまでと同じ方針を採用します。したがって、2012年の初期に2.0の最終版がリリースされるとして、その後、2013年にリリースされるであろう後継のメジャーバージョンが 3.0 になります。でも、私たちはGoogle ChromeMozilla Firefoxのような超高速の番号体系は採用しないのでどうかご心配なく!

2.0の何がそう特別なの?

静的型チェック

私たちはGroovyの静的型チェックのサポートについて作業を進めて来ました。

私たちは、多くのJavaプロジェクトで、GroovyがJava API用のシンプルで強力なスクリプト言語として使われていることに気づきました。Grooovyの動的な特徴は特に活用せず、より良いシンタックスを持つJavaとして使われているのです。この用途では、開発者はメソッドやパラメータ、変数名などのミスタイプや、不正な代入などを防ぐ意味で、より厳格な型チェックを好むことが多いようです。後の実行時ではなく、コンパイル時にコンパイラが問題を検出すれば、この種の誤りに対するフィードバックをより早期に得ることができます。これは、特に変更される可能性があるAPIを使っている場合に役立つでしょう。

静的型チェックについては、これまでGroovyメーリングリストでも議論されてきましたが、その実装方法や振る舞いなどについてのフィードバックは引き続き歓迎しています。ぜひこのトピックについてあなたの考えやアイデアをお聞かせください。

この新しい特徴をカバーしたGEP(Groovy Extension Proposal: Groovy拡張提案)も作成しました:
http://docs.codehaus.org/display/GroovyJSR/GEP+8+-+Static+type+checking

また、SpringSource/VMwareのJochenと私のチームに新たに加わり、この機能を担当しているCédricも現状についてブログに詳しく書いています:
http://www.jroller.com/melix/entry/groovy_static_type_checker_status

上の二つのドキュメントには、Groovy 2.0.0-beta-1での静的型チェックの使い方の具体例なども示されていますので、ぜひ読んでみてください。なお、この機能はまだベータ版であることを忘れないでください。みなさんのフィードバックでAPIが変わったり進化するかもしれません。

静的コンパイル

静的型チェック、型推論機能、フローセンシティブタイピングなどによって、Groovyコンパイラはコードが実際に何をしているのかずっと賢く理解できるようになりました。上述のようなJava APIに対するスクリプティングの場合、コンパイラにGroovyのMOPを経由しない、Java流の直接のメソッドコールを生成させることができ、Javaと同レベルの性能が実現できるかもしれません!

2.0では、賢くなった新コンパイラとその基盤を活かした静的コンパイルを検討中です。初期サポートを盛り込んだ新しいgitブランチを作るので、みなさんもこの方面の進捗を監視することができるでしょう。

Groovy++はどうなったの?

Alex TkachmanとRoshan Dawraniの素晴らしい業績であるGroovy++拡張プロジェクトは、私たちに明確なヒントを与え、Groovyでの静的型チェック・コンパイルのサポートの重要性を確信させてくれました。Groovyのコア部分に関する考え方の違い、例えば、私たちが欲しかったものに比べ広すぎる守備範囲(永続コレクション、新しい演算子、トレイト、新しいマップスタイルのクラスなど)といった理由から、Groovy++をGroovy 2.0に単純に統合することはできませんでした。また、私たちはプリミティブ型の最適化作業や、静的型チェック・コンパイルinvoke dynamicサポートなどにうまく適応できるようにGroovyコンパイラのインフラを進化させたかったのですが、このためにはGroovy++に大幅な改造を加える必要があったのです。とは言え、Groovy++チームと協力し、Groovy++の開発経験から学ばせてもらうことはもちろん大歓迎です。

私たちはコミュニティにも参加し、静的型チェック・型推論のさまざまな側面を議論しました。新たなデータ構造を導入したり、既存の機能(非final変数を持つクロージャのような)を制限したりすることなく、できる限り従来のGroovyセマンティクスに近づけるためです。この結果、静的型チェック・コンパイルの導入はGroovy開発者の負担にならず、追加モードと従来の動的モード間のセマンティクスの違いによるインパクトは最小限です。

Invoke Dynamicのサポート

最後に、動的言語のために開発された、JDK 7の新しいJVMバイトコード命令とAPIである、"invoke dynamic"のサポートについても作業を始めました。Groovyのあらゆる動的な機能の性能を大きく改善することが目標です。まだごく初期の段階で、最初のベータである2.0には目につく変更点は含まれていませんが、Git(とGitHub上のミラー)の"indy"ブランチでは作業を進めています。

2.0以後は?

静的型チェック・コンパイルやinvokeDynamicのサポートによって、このリリースはまさにGroovy 2.0という命名にふさわしいものになったと思います。では次は何でしょう?

2.x / 3.0以降で取り組みたい項目の中では、Groovyの文法をAntlr 2.xからより新しいバージョンに移行させることに興味があります。Antlr 3はしばらく前にリリースされていますが、この夏に行った移行の試みはまだ成果がでていません。しかし、2.0が出た後にもう一度調査し、Antlr 3で行くのか、それともGroovy 3.0をリリースする頃には使えるはずのAntlr 4で行くのかを決めるつもりです。

メタオブジェクトプロトコルの再設計(MOP 2)については過去に何度も言及してきました。Groovy 2.0のinvoke dynamicサポートや、JITinvoke dynamic性能の調整などの経験に基づき、invoke dynamicの利点をフル活用して、より高性能な動的機構を実現する、MOP再設計のより良いビジョンを持つことができるはずです。

他にも検討したい課題はたくさんありますが、現時点でGroovy 3やそれ以後を語るのは少し時期尚早でしょう。開発者の生産性をさらに向上させるためにGroovyに何を追加するべきか、少し考えてみましょう。みなさんの日々の業務をシンプルにするために将来のGroovyに求めるものをぜひお聞かせください。

今日のGroovyはみなさんのアイデアや貢献の賜物なのです!

重要なリンク

変更点の詳細についてはJIRAの変更履歴をご覧ください:

そしてこれらの新リリースはGroovyサイトのいつものダウンロードエリアから入手できます:
http://groovy.codehaus.org/Download?nc

Groovyに関わるすべての方に改めて感謝するとともに、みなさんからのフィードバックを楽しみにしています!

Groovy開発チーム

JavaFX勉強会でGroovyFXの発表をしました

第 6 回 JavaFX 勉強会 : ATNDGroovyFX の紹介をしてきました。当日使った発表資料はこちら:

表紙は猫メソッドならぬサンフランシスコメソッド(今名づけた)。今回はJGGUGじゃなくJavaFX勉強会での発表だったので、資料の前半はGroovy自体やビルダーの簡単な説明になってます。肝心のGroovyFXについては、スライドベースではなく具体的なコードを動かし、そのポイントを解説する形でお話したので、この資料だけではあまり参考にならないかもしれません。以下に発表に使ったサンプルコードを貼って、簡単なポイント解説をつけておきます:

サンプル(1)

Google+APIでプロフィール情報を取得し、GroovyFXで写真、名前、タグラインを表示するシンプルな例。写真をクリックするとくるくる回る。

ポイント:

  • 基本的なシーングラフの構築方法、ノード属性の指定方法
  • エフェクトやトランジション、イベント処理なども一応すべて盛り込んだ
  • Groovyには(JavaFXからは消えてしまった)JSONパーサが標準で備わっていて、JSONの扱いも非常に簡単なことをさりげなくアピール v(^_^)

サンプル(2)

動画(flv)を再生し、再生中に対話的にエフェクトやトランジションをかける。sキーでセピア、bでぼかし、tで複合トランジション(回転+拡大+フェードイン)。

ポイント:

  • JavaFXではたとえ再生中の動画にでもエフェクトやトランジションをかけられる
  • ParallelTransitionのあたりの簡潔かつ明快な記述
  • キーイベントの処理

なお、この例ではやってませんがエフェクトも複合することもできます。

サンプル(3)

TwitterHTML5なwebコンテンツを連携させる例。指定文字列(ここでは"#jjfxug")を含むtweetがあると、マリオのコイン音と共にwebコンテンツ内にボールが1個落ちる。tweetにホットワード(ここでは"groovy")が含まれていると1up音と共にボールが10個落ちる。GroovyFXで、Twitter4JのストリーミングAPIと、WebView内に表示したHTMLページのJavaScriptを連動させて実現している。

ポイント:

  • JavaFXの内蔵ブラウザ(webkitベース)は結構HTML5に対応している(ちなみにAcid3テストのスコアは99点)
  • 動的なシーングラフノードの追加
  • Javaライブラリをつなぐ (Twitter4J + JavaFX) グルーとしてのGroovyの便利さ
  • なにげに便利なAudioClip
  • みんながライブで参加できるデモをやってみたかった!

セッションやデモの様子はTogetterやust録画でも見られます:

最後に

声をかけていただいた[twitter:@skrb]さん、運営にあたっていた[twitter:@yoshioterada]さん、GroovyFX情報を交換した[twitter:@touchez_du_bois]さん、どうもありがとうございました。(_o_)

おまけ

12/1開催のJava Developer Workshop #2は絶賛申し込み受付中!
http://www.oracle.com/goto/jpm111201
JavaFX 2.0、そしてScala/JRuby/Groovyなどに興味がある方は必見ですよ!

Gaelyk 1.0リリースノート(翻訳)

原文: http://docs.codehaus.org/display/GROOVY/2011/08/05/Gaelyk+1.0+released+--+lightweight+Groovy+toolkit+for+Google+App+Engine

Google App Engine用の軽量Groovyツールキット、Gaelyk 1.0の正式リリースをここに喜んでお知らせいたします!

1.0にたどりつくまで少々時間がかかってしまいましたが、プロジェクト開始時からずっと欠けていると感じていた重要な機能、クエリDSLを備えた待望のリリースです。このクエリDSLを使えば、クエリを次のように書くことができます:

def latestArticles = datastore.execute {
    select all from articles
    sort desc by dateCreated
    where author == params.author
    limit 10
}

この軽量フレームワークについて、もっと詳しく知るためには下記を参照してください: http://gaelyk.appspot.com/

こちらのチュートリアルですべての機能について学べます: http://gaelyk.appspot.com/tutorial

JARファイルやテンプレートプロジェクトは以下からダウンロードしてください: http://gaelyk.appspot.com/download

Googleグループで質問したり、コミュニティに参加したり、このオープンソースプロジェクトの開発に加わりたい場合は、こちらのコミュニティページをのぞいてみてください: http://gaelyk.appspot.com/community

このリリースは、みなさんからのGitHubでのpullリクエストや、Gradleプラグインバグレポート、そしてGoogleグループでの質問のような、素晴らしい貢献がなければ決して実現しなかったでしょう。すべての協力と貢献に心から感謝します。本当にありがとうございました。そして引き続きよろしくお願いします!

変更履歴:

以上、お読みいただきありがとうございました。では、Google App Engine上でのGroovyアプリケーション開発をお楽しみください!