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月25日水曜日

ビルド結果のファイルを別のマシンへ転送する(maven, Hudson)

maven+hudsonを使ってビルドやら何やらを自動化しているが、成果物を別のマシンにscpしたいという要求が出てきた。これをHudson+plug-inでやるか、maven2+plug-inでやるか?で迷った。といぅか、どっちも目的の処理を行う事ができるplug-inがあるのか?からして謎だったw maven2はwagonを使った経験が遠い過去にあったので、それかなー?くらいに目星はついたが、Hudsonは一度設定してしまえばそぅそぅ触る事も無いしすっかり忘れかけていたり。

maven

ずばり、maven-wagon-pluginで正解だった。

  • deploy-pluginで別マシンへinstallする時と同じように、settings.xmlのservers要素の配下に転送先のserverの設定が必要。
    <server>
      <id>remotehost</id>
      <username>shin1ogawa</username>
      <password>password</password>
    </server>
  • pom.xmlはbuild/plugins配下に以下のように設定。この例ではpackageフェーズが実行されたタイミングで起動している。
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>wagon-maven-plugin</artifactId>
      <version>1.0-beta-1</version>
      <executions>
        <execution>
          <id>upload-jar</id>
          <phase>package</phase>
          <goals>
            <goal>upload</goal>
          </goals>
          <configuration>
            <serverId>remotehost</serverId>
            <url>scp://192.168.1.109/</url>
            <fromDir>target</fromDir>
            <includes>**/*.jar</includes>
            <excludes>*-sources.jar</excludes>
            <toDir>/home/shin1ogawa/tmp</toDir>
          </configuration>
        </execution>
      </executions>
    </plugin>
    

Hudson

電車の中でiPhoneからぶつぶつつぶやいていたら、@kompiroからアドバイスが。

名前もそのもまんま。設定方法もシンプル。

  1. 上記リンクからプラグインファイル(*.hpi)をダウンロードして、Hudsonのルート画面から[Manage Hudson][Manage Plugins]をたどってプラグインをインストールしておく。んで再起動する。
  2. Hudsonのルート画面から[Manage Hudson][Configure System]をたどり、[SCP repository hosts]を設定する。例ではパスワードで認証する設定だけど、鍵ファイルを使う事もできそぅだ(項目があるし。これでできなかったらビックリする。)。
  3. ファイル転送を行うためのjobの設定画面を開き、[Post-build Actions]に表示されている[Publish artifacts to SCP Repository]にチェックを入れる。すると他のプラグインと同じように、プラグインの設定パネルが表示されるのであれこれ設定する。[Destination]にはHudsonの全体設定の[SCP repository hosts][Root Repository Path]で設定したパスからの相対パスを指定する。存在しないフォルダを指定してみると、ちゃんとフォルダを作ってから転送してくれた。

転送先が複数ある場合であれば、hudson+SCP-pluginだと複数のjobにしなきゃならん?ような気がするので、maven-wagon-pluginの方がいいかな。maven-wagon-pluginであればexecutionの定義をたくさん書いてしまえばいいだけだし。

2009年2月24日火曜日

メニューに書いてある記号に対応するキーがわからない


一番上にある「Show Navigation Bar」に対応するキーは何だろう?Optionと何かなんだろうけど、左斜め上向きのアイコンに対応するキーがわからない…。初めて見たと思うな。

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で管理されている点に注意が必要。

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