ラベル Eclipse の投稿を表示しています。 すべての投稿を表示
ラベル Eclipse の投稿を表示しています。 すべての投稿を表示

2009年7月30日木曜日

よぅやく eclipse #galileo (3.5) に対応した #appengine plugin がリリースされた

まだアナウンスはされていないようですが、リリースされています。自分はeclipse-SDK-3.5-macosx-cocoa-x86_64で確認しました。アップデートサイトのこれまで同様の命名規則のURLで、以下のとおり。

dropinのフォルダを作りたい人向けの情報

features
  • features/com.google.appengine.eclipse.sdkbundle.e35.feature_1.2.2.v200907291526/
  • features/com.google.gdt.eclipse.suite.e35.feature_1.1.0.v200907291526/
  • features/com.google.gwt.eclipse.sdkbundle.e35.feature_1.7.0.v200907291526/
plugins
  • plugins/com.google.appengine.eclipse.core_1.1.0.v200907291526.jar
  • plugins/com.google.appengine.eclipse.sdkbundle_1.2.2.v200907291526/
  • plugins/com.google.gdt.eclipse.core_1.1.0.v200907291526.jar
  • plugins/com.google.gdt.eclipse.platform.e35_1.1.0.v200907291526.jar
  • plugins/com.google.gdt.eclipse.platform.shared_1.1.0.v200907291526.jar
  • plugins/com.google.gdt.eclipse.platform_1.1.0.v200907291526.jar
  • plugins/com.google.gdt.eclipse.suite_1.1.0.v200907291526.jar
  • plugins/com.google.gwt.eclipse.core_1.1.0.v200907291526.jar
  • plugins/com.google.gwt.eclipse.sdkbundle.macosx_1.7.0.v200907291526/
  • plugins/javax.xml_1.3.4.v200902170245.jar
  • plugins/org.apache.xerces_2.9.0.v200909240008.jar
  • plugins/org.apache.xml.resolver_1.2.0.v200902170519.jar
  • plugins/org.apache.xml.serializer_2.7.1.v200902170519.jar
  • plugins/org.eclipse.emf.common_2.5.0.v200906151043.jar
  • plugins/org.eclipse.emf.ecore.change_2.5.0.v200906151043.jar
  • plugins/org.eclipse.emf.ecore.edit_2.5.0.v200906151043.jar
  • plugins/org.eclipse.emf.ecore.xmi_2.5.0.v200906151043.jar
  • plugins/org.eclipse.emf.ecore_2.5.0.v200906151043.jar
  • plugins/org.eclipse.emf.edit_2.5.0.v200906151043.jar
  • plugins/org.eclipse.jem.util_2.0.200.v200905140200.jar
  • plugins/org.eclipse.wst.common.core_1.1.201.v200806010600.jar
  • plugins/org.eclipse.wst.common.emf_1.1.300.v200905060430.jar
  • plugins/org.eclipse.wst.common.emfworkbench.integration_1.1.300.v200811200330.jar
  • plugins/org.eclipse.wst.common.environment_1.0.202.v200807161459.jar
  • plugins/org.eclipse.wst.common.frameworks_1.1.300.v200904160730.jar
  • plugins/org.eclipse.wst.common.project.facet.core_1.4.0.v200906080535.jar
  • plugins/org.eclipse.wst.common.uriresolver_1.1.301.v200805140415.jar
  • plugins/org.eclipse.wst.sse.core_1.1.400.v200905141750.jar
  • plugins/org.eclipse.wst.sse.ui_1.1.100.v200905141750.jar
  • plugins/org.eclipse.wst.validation_1.2.102.v200905201610.jar
  • plugins/org.eclipse.wst.xml.core_1.1.400.v200904300540.jar

2009年7月16日木曜日

#appengine for java sdk1.2.2への対応方法

14日の日本時間の午前中にGoogle App Engine BlogにてGoogle App Engine for Java 1.2.2をリリースしたという公式のアナウンスがあった。その日の夜くらいに確認すると、mvnsearchのリポジトリにも1.2.2対応のモジュールがアップロードされているのが確認できたので、動作確認を行っていた。が!!単体テスト周りが結構動かなくて苦労したw やっぱり、mavenとeclipse両方で動作させる事ができなきゃツライんで、そこを目指す人向けにメモを書いておく。

公式のアナウンスより

リリースノートのURLはhttp://code.google.com/p/googleappengine/wiki/SdkForJavaReleaseNotes。目玉としては、pythonのSDKにあるローカル環境でのDatastoreの確認を行う機能が搭載された事。これはありがたい。他にもdatanucleusの不具合対応の取り込みとか。あと、

Better emulate datastore transaction support in the DevAppServer.
ってのがあるので、Low-Level APIでのTransactionがそろそろサポートされたはずだと期待。Task Queue APIは入ってない。

Eclipseのプラグインは、メニューから[Help][Software Updates]で[Software Updatesand Add-ons]画面を開き、[Installed Software]からGoogle関連のモジュールを選択して[Update]すればおk。プロジェクト毎にSDKのバージョンを設定する事も出来るが、設定の[Google][App Engine]でデフォルトをどれにするか?を選択する事も出来る。ついでに書いておくと、Galileo対応のGoogle Plugin for Eclipseは来週くらいにリリースされそうなカンジだ。

sdk単体でのダウンロードURLは http://googleappengine.googlecode.com/files/appengine-java-sdk-1.2.2.zip。日本語のダウンロードサイトは未だに1.2.0へのリンクがあるよぅだw

com.google.apphosting.api.ApiProxy.Environmentのインターフェースが変わっている

public void setDefaultNamespace(String s)が無くなって、Map getAttributes()ってのが増えてる。この件はappengine-java MLでも話題になっていたけど、中の人の返信があって、その内容で落ち着いたみたい。

JDOのEntityの状態が変わった

Query#execute()した直後のEntityの状態
  • 1.2.1: ObjectState.PERSISTENT_NONTRANSACTIONAL_DIRTY
  • 1.2.2: ObjectState.HOLLOW_PERSISTENT_NONTRANSACTIONAL
Transaction開始後に値を操作したEntityの状
    1.2.1: ObjectState.PERSISTENT_NONTRANSACTIONAL_DIRTY
  • 1.2.2: ObjectState.PERSISTENT_DIRTY

変わった、といぅよりは「正しくなった」という事なんでしょね。

低レベルAPIでTransactionがサポートされた

例えば、1.2.1までは次のように無理矢理transaction.rollback()してもロールバックは効かなかったが、1.2.2でよぅやく正しくロールバックされるよぅになっていた。

maven対応は…?

ちゃんとできる。が、ちょっと納得いかない点もある。まずは作業結果のリンクを貼っておく。

自分のJDOの動作確認用プロジェクトではJPAは使っていないんだけど、JPAのモジュールを含めておかないと次のようなExceptionが投げられる。

java.lang.RuntimeException: Unable to replace JPACallbackHandler.
at org.datanucleus.store.appengine.DatastorePluginRegistry.getExtensionPoint(DatastorePluginRegistry.java:66)
at org.datanucleus.plugin.PluginManager.getExtensionPoint(PluginManager.java:65)
at org.datanucleus.plugin.PluginManager.getConfigurationElementForExtension(PluginManager.java:113)
at org.datanucleus.plugin.PluginManager.getAttributeValueForExtension(PluginManager.java:230)
...

で、org.datanucleus:datanucleus-jpa:1.1.4:providedを追加する。maven的にはコレでokだけど、この状態で$ mvn eclipse:eclipseしてしまうと、eclipse側でテストを実行した時に次のようなExceptionが投げられる(根っこの原因を抜粋)。

org.datanucleus.exceptions.NucleusException: Plugin (Bundle) "org.datanucleus.jpa" is already registered. Ensure you dont have multiple JAR versions of the same plugin in the classpath. The URL "file:/dropins.ganymede/google/plugins/com.google.appengine.eclipse.sdkbundle_1.2.2.v200907131030/appengine-java-sdk-1.2.2/lib/user/orm/datanucleus-jpa-1.1.4.jar" is already registered, and you are trying to register an identical plugin located at URL "file:/Users/shin1/.m2/repository/org/datanucleus/datanucleus-jpa/1.1.4/datanucleus-jpa-1.1.4.jar."

これを回避する為に、pom.xmlのmaven-eclipse-pluginの定義で、configuration/excludes/excludeの値に org.datanucleus:datanucleus-jpaを追加してやるとおk。

mavenから実行する時のエンハンサとして使用するmaven-datanucleus-pluginのバージョンが1.1.3しか見つからなかったので1.1.3を使っていて、とりあえずそれでも問題は起こっていない。が、他のモジュールに合わせて1.1.4がリリースされるんじゃないかな。

2009-07-27追記

UnitTest中にUserServiceを使いたい場合は、TestEnvironment.javaのgetAuthDomain(), isLoggedIn(), getEmail()が値を返す必要があるので注意〜。

2009年6月1日月曜日

ActionScriptのエディタ

うちの嫁が開発している Amateras Project の AIR GEAR に使ってもらおうと思っているActionScript用のエディタEclipseプラグインが少しずつ動き始めた。

AIR GEAR に足りない、構文解析が必要な機能(Outline, Type Hierarchy, Code assist)を主に組み込んでいくつもりなので、今はAIR GEARのテキストエディタよりも機能が貧弱だw

こいつはsf.jpにプロジェクトを立てて作業してます。sf.netはsvnが遅すぎて使い物にならない…。

2009年3月17日火曜日

Eclipseの比較エディタ

比較エディタがアクティブな状態だと、ツールバーに「空白文字を無視する」というボタンが表示される。今日初めて知りました…。

2009年3月15日日曜日

Eclipse上でのレビューPlug-in: ReviewClipse

先日、eclipse plugin centralでReviewClipseというプラグインが紹介されていた。少し試してみたところ、以下のような特徴がある模様。

  • SVN専用ぽい。SVN用のPluginが必要で、SubVersiveとSubClipseに対応している
  • Commitしたchangesetに対するレビューセッションを作成する。これはGoogleのMondrianやその他でよく見られる「Commit前にレビュー」とはちょっと違う。個人的には何はまずリポジトリにCommitしておきたいので、この方法の方が好き。
  • レビューセッションやフィードバック等の情報を管理するリソースは先頭がドットのXMLファイルで保存され、これらのファイルもリポジトリにコミットされる
  • このPlugin的には、管理用のXMLファイルのビューアとして機能を提供するかんじ。

ここまでは、まぁ結構仕えそうなカンジだったんだけど、肝心のレビュー機能自体に問題が。

  • レビューで使うツールはdiffのみ。JDTのdiffでもなく、普通のdiff。
  • changesetに対して行えるフィードバックは「ステータス(Warning/Pass/Failure)」と「メッセージ」のみ。どのファイルのどこが…といぅよぅなコメントを残せない!

ちょっと惜しいなぁ、というツールでした。

2009年3月2日月曜日

EclipseでIndex out of bounds

最近Eclipseがしょっちゅう図のような状態になる。

一度これが出たら、再起動するまではしょっちゅうこれが出てかなりストレスフル。ピンポイントで原因が分かるとか、こういった操作を一度行うとこのじょうたいになりやすい、みたいな傾向をご存知の方はおられませんか?おられたら何か情報を下さい><

追記

たぶんコレっぽい。

!ENTRY org.eclipse.ui 4 0 2009-03-02 23:31:30.356 !MESSAGE Unhandled event loop exception !STACK 0 java.lang.IllegalArgumentException: Index out of bounds at org.eclipse.swt.SWT.error(SWT.java:3761) at org.eclipse.swt.SWT.error(SWT.java:3695) at org.eclipse.swt.SWT.error(SWT.java:3666) at org.eclipse.swt.graphics.TextLayout.getStyle(TextLayout.java:1609) at org.eclipse.swt.custom.StyledTextRenderer.getTextLayout(StyledTextRenderer.java:864) at org.eclipse.swt.custom.StyledTextRenderer.getTextLayout(StyledTextRenderer.java:656) at org.eclipse.swt.custom.StyledTextRenderer.drawLine(StyledTextRenderer.java:354) at org.eclipse.swt.custom.StyledText.handlePaint(StyledText.java:5310) at org.eclipse.swt.custom.StyledText$7.handleEvent(StyledText.java:4878) at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1561) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1585) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1570) at org.eclipse.swt.widgets.Control.drawWidget(Control.java:850) at org.eclipse.swt.widgets.Canvas.drawWidget(Canvas.java:114) at org.eclipse.swt.widgets.Widget.kEventControlDraw(Widget.java:1069) at org.eclipse.swt.widgets.Canvas.kEventControlDraw(Canvas.java:191) at org.eclipse.swt.widgets.Widget.controlProc(Widget.java:370) at org.eclipse.swt.widgets.Display.controlProc(Display.java:862) at org.eclipse.swt.internal.carbon.OS.StillDown(Native Method) at org.eclipse.swt.widgets.Display.runEnterExit(Display.java:3444) at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3067) at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2382) at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2346) at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2198) at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:493) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:288) at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:488) at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149) at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:113) at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:193) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:386) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:549) at org.eclipse.equinox.launcher.Main.basicRun(Main.java:504) at org.eclipse.equinox.launcher.Main.run(Main.java:1236)

2009年2月26日木曜日

続:IntelliJ IDEAのjavadocの件

前回のエントリ「IntelliJ IDEAはjavadocコメントが弱いのかな?」にmasanobu氏よりコメントを頂戴した。

File -> Settings -> Errors -> Inspections -> General -> Declaration has javadoc problems を有効にしてみてはどうでしょう?

実は、これは一応設定しているつもりなのだ。
次のようなカンジ。

で、設定が効いているのかどぅかをちゃんと確認してみようと思って[Analyze][Inspect Code]すると、Inspection Viewには「問題あり」とは出てきた。
出てきているが、SevertyをWarningとして設定したのだがInspection View内の表示ではInformationとして表示されているような…?それとも(i)アイコンが警告を意味するものなのかな?
ちなみに、このInspection Viewの右側にある[Probrem resolution:]の欄に"Add tag @param for parameter 'a'"というリンクがあって、これをクリックするとリンクにある通り「@param a」が挿入される。

なんでそんなにズレてるんだよwと突っ込みたくなるが、フォーマットすれば問題ないから気にしない。むしろ問題なのはキーバインドによるFIXじゃない事。わざわざInspection Viewを開いて…とかしないし。

だが、masanobu氏のアドバイスを見る限り、masanobu氏はできているんだろぅと想像できるので、なんとか探そうと…と思ってメソッド名にカーソルを移動したら「ステータスバーに"Required tag '@param' is missing for parameter 'a'"と表示されている」ではないか。マウスカーソルをメソッド名に持っていくと、ポップアップで同じ内容が表示された。

[more...]を見ようとしてメッセージの通りCommand+F1を押しても何も状態が変わらないが、とりあえずそれは置いておいて、ここまで来たら後はmasanobu氏から教えてもらった必殺Alt+Enterでなんとかなるはず!!!

めでたくキーバインドだけで解決できました!よくよく見たら薄く色が変わってるし、気付け俺w

ただ気になるのは、SeverityのWarningが効いていないように見える事、それと追加タグとして入力してみた"@category"タグに対して"Wrong tag"という問題を報告してくる点。

これは[Problem resolution]の[Add category to custom tags]すりゃいーか、どーせ一回設定すりゃもぅ触らないしキーバインドとかいいよ、と思ってクリックする→問題が消える。だがしかし!もぅ一度Inspect Codeすると復活する…。

追記

@categoryタグに対する"Wrong tag"といいがかりをつけてくる冤罪問題が解決できない件、Inspection Viewの[Probrem resolution]のリンクを使わずに「Alt+Enter」で解決してやると2度と出てこなくなったよぅです。設定された内容を見てみるとjavadocの追加タグは「@category」と入力するのではなく、@を抜いた「category」と入力するようです。複数指定する時はカンマ区切りで。

IntelliJ IDEAはjavadocコメントが弱いのかな?

IntelliJ IDEA8.1を試用しつつEclipseと天秤にかけているんだけど、ひとつどうしても解せない点があった。それはJavaDocコメントの生成機能。まず、コマンドが見当たらない。Eclipseでは「Command+Alt+J」のやつ。

IDEAでは「Command+Shift+A」がEclipseでいうQuickAccessのような機能にあたるっぽいのだが、そこで"javadoc"と入力しても、html形式でクラスを出力するjavadoc出力機能とソース内のJavaDocコメントをCollapse/Expandする機能しか抽出されない。「Control+Enter」がEclipseでいう「Command+Alt+S」から選択できる「Generate ...」の機能なのだが、こちらでもJavaDocの文字は無い。

公式ドキュメントを見ると、対象の前で"/**"と入力しろ、とか書いてある事は確認できた。が、一度出力できたとしても途中でパラメータを手動で追加した場合はどう追随するのか?また、設定で[Errors][Inspections][General]あたりでJavaDocの不備を警告するよう設定してみてEclipseでいうQuickFixにあたる「Show Intention Actions(ALT+Enter←@masanobuimaiが教えてくれました、ありがとう!)」をやってみても、@paramを追加してくれそうなカンジではない。JavaDocは間違っていると無い方がマシ、でも結構メンテする対象だから便利に使えないのは負担になりそう。

ちなみにEclipseのQuickFixだとこんなカンジ。

他にはCheckstyleとFindBugsの設定(どっちも通常はxmlで定義するんじゃないか、と)を適用する方法もまだわかってないので、調べないといけない。標準のxmlを他の人と共有できないと致命的すぎるし、プラグインがあるのかもしれない。

Eclipseユーザから見たIntelliJの嬉しい機能

多分に偏っている可能性があるかもしれないけれどもw、今のところ「すげぇよ、いいよ!」となった点。

  • 補完でワイルドカードが使える。
  • 補完で例えばgPで絞ると"getParameter"等が対象になる。キャメルケースで絞り込んでいけるのが超便利。
  • カーソル移動をemacs風に設定可能。これを設定すると、補完候補がポップアップされた状態でControl+N|Pによる上下の移動が可能になって助かる。
  • コンテキストメニューにキーバインドを設定できる。
  • [Appearance][Window Options][Disable mnemonics in menu]のチェックを外すとコンテキストメニュー内でニーモニックが使用できるようになる。
  • File Path(Command+Alt+F12)で現在アクティブなエディタのパス階層がポップアップされて、どこかを選択すると Finderへジャンプできる。

追記

コメント欄にてid:daisuke-mより「補完候補でキャメルケースはEclipseでもできるぞ」との指摘がっ!確かにできた。今までどれくらいの無駄なタイピングを行ってきたかと思うと寒くなってしまぅな…。だいちゃん教えてくれてありがとーぅ!

2009年2月22日日曜日

Eclipseの自動補完でCollectionに対するGenericsの扱い


こんなカンジで、クラス名が衝突していてFQCNを使わざるをえない場合。


こうなってしまう。

2009年2月15日日曜日

Eclipse PDEのMANIFEST Editorにて

依存しているjarを追加しようと思い[build]タブの[Runtime Information]に[Add library]する。

すると、build.propertiesが以下のように編集される。

何やら警告のマーカーがついていて、説明は

Build entries must contain at least one value
となっているが、何を記述すれば良いのやらワカラン。ソースのjarの位置を指定すればいいのか?と思って試しに「lib/sources/commons-beanutils-1.8.0-sources.jar」とか指定してみたが、警告は消えてくれない。何を指定すればいいんだ><

追記

上記の「lib/sources/commons-beanutils-1.8.0-sources.jar」を指定した状態で警告の説明が「The folder "lib/sources/commons-beanutils-1.8.0-sources.jar" does not exist in the workspace」と変わっていた。フォルダを指定すればいいのか?と思い、指定を「lib/sources」に変えたら警告は消えた。対応するソースjarファイル名を勝手に解決してくれるんだろうか?

2009年2月6日金曜日

FlexSDKのソースを少し覗いてみる

ActionScript3の構文解析をやりたい(正確には構文解析されたオブジェクトを利用したい)と思っているので、しげるんがアドバイスしてくれたASCを触ってみている。とりあえずはWikiにも書かずメモ程度にここに書いておく。

準備

EclipseにSubversiveとq4eを入れてある事が前提。プラグイン等の詳細はwikiの方を参照する。ちなみに、FlexSDKのソースはJava5以上が前提です。

ソースの取得

FlexSDKのリポジトリのURLは"http://opensource.adobe.com/svn/opensource/flex/sdk"。

  1. 構文解析を行ってくれるモジュールは"modules/asc"なのでcheckoutすりゃいいのだが、FlexSDKのサイトを見ると最新の安定板のバージョンは3.2系っぽいので、tagにある"3.2.0.3958"からcheckoutする事にする。
  2. ついでに、swfを扱えそうなモジュールである"modules/swfutils"も"tags/3.2.0.3958"からcheckoutする。
  3. checkoutしただけだと、Eclipse上ではそもそもJavaProjectですらない扱いとなってしまうが、次の手順でq4eを使って簡単にビルドする。

ビルド

q4eを前提に、pom.xmlを書いた。

  1. まず以下のpom.xmlをascプロジェクトのルートフォルダに配置し、パッケージエクスプローラ上でプロジェクトのルートを右クリックし、[Maven2][Use Maven dependency management]を選択する。
    <?xml version="1.0" encoding="UTF-8"?>
    <project>
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.adobe.opensource</groupId>
      <artifactId>asc</artifactId>
      <name>asc</name>
      <version>3.2.0.3958</version>
      <url>http://opensource.adobe.com/svn/opensource/flex/sdk/trunk/modules/asc</url>
      <build>
        <sourceDirectory>src/java</sourceDirectory>
        <outputDirectory>target/classes</outputDirectory>
        <plugins>
          <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
              <source>1.5</source>
              <target>1.5</target>
              <encoding>UTF-8</encoding>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </project>
    ちなみにGroupId,ArtifactID,Versionについては正式なものがわからんので適当にそれっぽく書いた。mavenを使わない開発なんてしたくないし、開発中はこれで十分だと思う。実際に何か作って依存するなら、SDK本体に付属のasc.jarを使えば良い。
  2. これだけで、q4eが勝手にJavaProjectとしてEclipseに認識させてくれた上にコンパイルも終了している(target/classesに出力されている)。
  3. 実際触るには、ソースも欲しいので、パッケージエクスプローラから[Maven2][Execute Goal]を選択して、Goalには"clean source:jar install"を指定する。これを実行すれば、target直下に"asc-3.2.0.3958.jar","asc-3.2.0.3958-sources.jar"がパッケージとして出力される。q4eを使えばこんなにラクチン。
ascだけが必要ならこれだけで良いのだが、swfutilsも気になるのでこっちもビルドする。swfutilsは以下のpom.xmlを使って、ascと同じ手順を実施すればそれだけでOKOK。
<?xml version="1.0" encoding="UTF-8"?>
<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.adobe.opensource</groupId>
  <artifactId>swfutils</artifactId>
  <name>swfutils</name>
  <version>3.2.0.3958</version>
  <url>http://opensource.adobe.com/svn/opensource/flex/sdk/trunk/modules/swfutils</url>
  <build>
    <sourceDirectory>src/java</sourceDirectory>
    <outputDirectory>target/classes</outputDirectory>
    <testSourceDirectory>test/java</testSourceDirectory>
    <testOutputDirectory>target/test-classes</testOutputDirectory>
    <resources>
      <resource>
        <directory>abc</directory>
      </resource>
    </resources>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.5</source>
          <target>1.5</target>
          <encoding>UTF-8</encoding>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.5</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.xmlgraphics</groupId>
      <artifactId>batik-svggen</artifactId>
      <version>1.7</version>
    </dependency>
    <dependency>
      <groupId>com.adobe.opensource</groupId>
      <artifactId>asc</artifactId>
      <version>3.2.0.3958</version>
      <type>jar</type>
    </dependency>
  </dependencies>
</project>

使ってみる

とりあえず適当なActionScript3のソースを作成して、解析させてみる。

  1. 適当に自分のプロジェクトを作成して、先にビルドしたascのモジュールかプロジェクトに依存させる。モジュールを依存させる場合はモチロン、ソースの添付もお忘れなく。
  2. Eclipseで実行の構成を作成する。メインクラスは"macromedia.asc.embedding.ScriptCompiler"で、引数として"-d -AS3 -outdir target -import ../asc/abc/toplevel.abc -import ../asc/abc/builtin.abc Hoge.as"を指定する。ここで「../asc/abc/*.abc」を指定しているが、これはascプロジェクト配下にあるabcファイルの事。これでコンパイルが実行され、targetフォルダにコンパイルされたabcが配置される。

構文解析に関するソースを読む

自分の場合は構文解析された結果を利用したいだけなワケだが、これすら大変。ascのソースには以下の特徴がある。

  • 基本的にコメントは一切ない。
  • かなり汚い。バッドプラクティスとしてとても参考になるケースがしばしば。
  • toString()がひどい。クラス名をリテラルで埋め込んであるだけとか。仕方がないからtoString()の中を置き換えてやれ、と思ってやってみると、「toString()の結果をロジックとして利用している箇所がある」ため、メインのロジックに影響を与えてしまい、正常動作しなくなる。
  • 構文ツリーのルートとなるNodeクラス(クラスだよ、インターフェースじゃないよ!)にあった「public static final boolean useDebugToStrings = false;」なる便利そうなフラグを発見して「そりゃデバッグモードがいいだろ」とフラグをtrueにすると、動作しなくなる。おそらくデバッグモードで動作確認されていないのではなかろうか。
とにかくむかつく事が多い。checkstyle使えよfindbugs使えよ!せっかく便利なツールが揃ってるのにさ!

まぁ、そう言ってても進まないので、ソースを読んでみたい人は以下をエントリポイントに読み進めていくのが良いと感じた。

  • ScriptCompiler/BatchCompiler
    これは実際にコンパイルを行う箇所なので、構文ツリーをどのように意味ある状態でアクセスできるように構築していけば良いかの参考になる。だが、常に同じ要素数を持つべき複数のListがそのまま生でフィールドとして扱われているとか、ヒドイので注意が必要。このクラス内でPairというクラスが定義されており、そいつらが前述の「ヒドイList」のインデックスに対応して各Fileの間の参照関係やら何やらを保持している、という事も重要。インデクスで管理て…Compilerではそんなに長期間保持する必要も無いからやっつけ仕事的な組まれ方なのかもしれない。
  • ProgramNode
    ASやabcのファイルと同じ単位でできあがるNode。この中にクラスに対応するNodeが複数ぶらさがって行くカンジ。
  • 普通はDOMを見るときはルートのインターフェースを見るだろ?とか思うかもしれないが、それはおすすめしない。Nodeはダメ。このクラスはコードリーディングの役に立たない(DOMのNodeのサブクラスのソースがいかにヒドイ事になっていそうか、という苦労の覚悟を決めるには役立つ)。
  • ObjectListというListのラッパークラスもあり、Nodeのコンテナとして使用される事が多い。が、何のためにラッパーになっているのか想像できない仕様。
  • 後はObjectValueやらReferenceValue等のValueObjectみたいなヤツら。
肝心の「参照の解決」などはNodeの中に存在しているというより(存在しているが)、上記のScriptCompiler等の中で定義されているいくつかのListで管理されている点に注意が必要。

…まぁ、地味に読んでいくしかないです。

2009年1月31日土曜日

EclipsePluginの青本が届いた!

EclipsePluginの青本とAGILE ESTIMATING AND PLANNINGが一緒に届いた。青本…やっぱり厚いなw 写真の一番下にあるのが青本。

下から2番目は青本と同じたけぞえさんが書いてる独習JavaScript。たけぞえさんは去年この2冊を書いておられたらしいが、どっちも厚すぎ!そりゃ忙しいわ…。

そして、上の2冊が最近やっと読み終えた「実装パターン」「ThoughtWorksアンソロジー」。どっちも非常に良い本だったからおすすめ!

それにしても、しばらくは読書が大変そうだ…(青本はリファレンス的に使うと思うけども)。

真ん中の銀色はMacbookAirです、薄いね!これもおすすめw

2009年1月23日金曜日

eclipseのアシストに感動した!

しょっちゅう感動してるし、そもそも有名な機能かもしれないけど。

  • まずはこんなカンジ
  • で、JComponent型の変数componentのinstanceofによる型の確認を少し書いてみると…

    すげぇぇぇ!まだifのブロックも閉じてないコンパイルエラーの状態だし、componentのキャストもまだ書いてないし!!
  • で、新たに候補として上がったAbstractButton#setText()を選択して確定するとこぅなる。

    まさに俺がやろぅとしていた事です!型推論どころか「あなた推論」をやってのけるeclipseすごいよ、マジすごい。
  • ちなみに、Class#equals()ではダメ。

europaでは確認できなかったのでganymedeから導入された機能だと思うけど、JDTのバージョンによってはeuropaでもできるのかな?

2009年1月21日水曜日

eclipseのリファクタは便利だけど、たまにビミョー

eclipseにメソッドを自動生成させた直後の状態だと、タブで各要素を移動しながら名称を変更できる。が、この状態でメソッドのパラメタの名称を変更しようとするとJavaDocの@paramが追随してこない。

自動生成直後じゃない場合は、当然追随してくれるんだけど。

2008年8月31日日曜日

MacのEclipseでXDocletがぬるぽる

Buildfile: workspace/.metadata/.plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/tempAnt.xml
init:
ejbdoclet:

BUILD FAILED
workspace/.metadata/.plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/tempAnt.xml:69: org.apache.commons.logging.LogConfigurationException: java.lang.NullPointerException (Caused by java.lang.NullPointerException)

Total time: 2 seconds
EuropaJEEでもGanymedeJEEでもこうなる。でもWindowsの方ではEuropa、Ganymede共に平気。Google先生に尋ねてみてもよくわかんない。
たまには自分でなんとかしろって事か。

2008年8月4日月曜日

Eclipse++

plugin.xml内の警告でQuickFixしてみると…。こんなとこでもQuickFixが有効になってるとは!知らなかった&便利だ!

2008年7月2日水曜日

3.4用のMylynで困った

Mylynは長い期間Ganymede(M*とかRC*とか)を使っていた時に3.3用のものを使っていて、正式リリースの時に3.4用のMylynに変えたら「ContextのRetrieve」ができなくなった。Contextを添付していないTaskは「Retrive」をClickすると空っぽの選択ダイアログが開くが、Contextが添付されたTaskで「Retrieve」すると選択ダイアログすら表示されない。ErrorLogには以下のExceptionが記録されていた。
java.lang.IllegalArgumentException: Argument cannot be null
at org.eclipse.swt.SWT.error(SWT.java:3761)
at org.eclipse.swt.SWT.error(SWT.java:3695)
at org.eclipse.swt.SWT.error(SWT.java:3666)
at org.eclipse.swt.widgets.Widget.error(Widget.java:681)
at org.eclipse.swt.widgets.TableItem.setText(TableItem.java:1054)
at org.eclipse.mylyn.internal.context.ui.wizards.ContextRetrieveWizardPage.createControl(ContextRetrieveWizardPage.java:146)
at org.eclipse.jface.wizard.Wizard.createPageControls(Wizard.java:170)
at org.eclipse.jface.wizard.WizardDialog.createPageControls(WizardDialog.java:669)
at org.eclipse.jface.wizard.WizardDialog.createContents(WizardDialog.java:543)
at org.eclipse.jface.window.Window.create(Window.java:431)
at org.eclipse.jface.dialogs.Dialog.create(Dialog.java:1089)
at org.eclipse.mylyn.internal.context.ui.actions.ContextRetrieveAction.run(ContextRetrieveAction.java:105)
at org.eclipse.mylyn.internal.context.ui.editors.ContextEditorFormPage$4.mouseUp(ContextEditorFormPage.java:276)
at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:207)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1561)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1585)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1570)
at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:1360)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3474)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3064)
at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2382)
at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2346)
at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2198)
at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:493)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:288)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:488)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:113)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:193)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:382)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:549)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:504)
at org.eclipse.equinox.launcher.Main.run(Main.java:1236)
誰かタスケテ><
Mylynに頼り切ってたから、この機能がが無いとどのTaskでどのファイルを触っていたかがわからんよぅ。

2008年7月1日火曜日

Eclipse3.4(Ganymede)...installできた!

@Ewigkeitのサイトを参考にしたら、MacでもGanymedeが無事installできた!

Update Siteからinstallしたもの

下記のProject AmaterasのUML,ERDを動作させるために必要

  • GEF(元々登録されている"Ganymede"の下にある)

Project AmaterasのPluginをいくつか。

これらは手動でjarを/pluginsフォルダに配置。「New-Others」するとAmaterasの名前が見えて、installできた!と安心したつもりだったが、AmaterasERDが動作してくれなかった…。下記は「New-Others」で表示されるNewダイアログで「AmaterasERD/ERDダイアグラム」を選択して「Next」をClickした直後に表示されるエラー。Wizardの起動に失敗しているよぅだが…。

2008年6月26日木曜日

Eclipseでfield名のリファクタ

以前、たけぞうさんがJJUGのクロスコミュニティカンファレンスでこんな事を発言しておられた。

Eclipseのfield名称を変更するリファクタリングはsetter/getterの名称も同期して変えてくれるのに、パラメータ名とJavaDocコメントが連動してくれない
自分的には、そもそもsetter/getterの名称まで変えてくれる事は知らなかったし、上記発言を効いた後も、何度やってもsetter/getterが自動的に変わった事は無かった。たけぞーさんが使ってるEclipseは特別仕様なのか?とかバカな事を考えていたが、やっとその方法がわかった。

  • Command+2 Rの「Rename in file」で名称を変更しようとするとこんなカンジになる。これではsetter/getterまで連動してくれない。
  • 上記とは違い、Command+Alt+Rで「Rename」を起動するとこんなカンジ。右にDropdownのボタンがある。
  • Dropdownをclickすると、こんなカンジ。
  • 「Open Rename Dialog」を選択する。
  • すると、setter/getterを連動させるためのチェックがあった!
これで便利になるわー。でも、確かにたけぞーさんの言う通り、パラメータが連動しないのが気になるよぅになったw