<< 1月 2008 | Home | 3月 2008 >>

PR: 会社設立ガイド!    お墓・総合サイト    バイク便をフル活用    バスって好き    縁探しにオススメ、結婚相談所♪    身に付けるアイテム    品物を預けてお金を借りよう    知っておきたい葬式マナー    マンガってロマンがあるね    転職   

締切3つ

今月は締切が3つ重なって、どうなることかと思ったけど、なんとか、あとは校正を残すのみとなった。月夜の梟で、前祝い。焼酎好きの向きには、お勧め。

GroovyのEclipse pluginはエンコーディングが指定できない?

ソースのエンコーディング指定が出来無いみたい。ソースをUTF-8で書いて、Windowsで実行とかできない模様。プロジェクトプロパティのResourceで、エディタの設定はUTF-8にできて、ソースの表示も問題無いんだけど、実際にコンパイルされたクラスファイル見ると、日本語部分が壊れてる。

P.S. GRECLIPSE-3みたいだ。

投稿者 Shisei Hanai : 2008/02/26 18:23:44 JST #

jaxb 2.1.xをJava6で使う。

なぜかUnofficial Guideに書かれている。Java6にはjaxb2.0が含まれているため、置き替える必要がある。次のいずれかで対処。

  1. jaxb2.1に含まれるjaxb-api.jarをJRE_HOME/lib/endorsedの下にコピー。
  2. java.endorsed.dirsシステムプロパティでディレクトリを指定し、そこにjaxb-api.jarを置く。
  3. クラスローダでjavax.xml.bindを親にdelegateしないようにする。

TortoiseHg

コマンドライン版同梱なのが、ポイント高い。

てれこ

お、ちゃんと辞書に載っているのか。なんとなく一般的な言葉ではないのかと思っていた。個人的に、どういう時に使うか思い起こしてみると、こんなのかな。

<div><b>...</div></b>

英語にも、こういう表現ってあるんだろうか。

xjcの出力ソースエンコーディング

xjcでスキーマからJavaソースに変換する時、出力エンコーディングが指定できない。そんなばかなと思ったけど、コマンドラインオプションには無いし、スキーマの中にannotateする方法も見つからない。普通は、大きな問題にならないのだろうけど、jaxb生成ファイルと、手で書いたソースの両方からJavaDocを生成しようとすると、どうしようもなくなる。

UTF-8がデフォルトの環境だと、jaxb生成ソースもUTF-8になる。ならば、手書きソースもUTF-8にしておけば良い。でも、これをWindows-31Jがデフォルトの環境に持って行くと困ることになる。javacまでは、ソースの格納場所を分けたりして、なんとかなるんだけど、javadocは、やっぱり1つにまとめたい。でもソースがバラバラのエンコーディングで記述されているソースを、JavaDocで処理することはできない。

XMLみたいに、Javaのソースも中にエンコーディングを明示的に書けると良かったのにねぇ。ついでにタブのサイズとかも明示的に書ければ、いらぬ争いを生まなくて済むのかも。

P.S. とりあえずJDK6付属版は、どうにもならない感じなので、jaxbのページから、2.1.6を入手、

java -Dfile.encoding=UTF-8 -jar jaxb_home/lib/jaxb-xjc.jar ...

で回避。

Groovyって動的にimportすることはできないのかな。

各人の環境設定のコミット合戦にならないように、環境設定をPath.groovy.sampleに入れておいて、それぞれでPath.groovyにコピーして使うように(Path.groovy.sampleだけレポジトリに登録)する。

で、gant fileの中で、Path.groovyがなかったら、Path.groovy.sampleから自動コピーして続行できるといいんだけど、そもそもgant fileの中にimport Pathがあると、エラーで実行そのものが全くできない。

なんかうまい方法がありそうな気もするんだけど、思いつかない。

猫ページ

猫ページ更新完了。

月光も修正

第三楽章を修正。

テンペストを更新。

またちょっと修正

gant Execute.shellで、exit codeを取得できるようになった。

Executeクラスのメソッドから、Process.waitFor()の戻りを返してもらうように変更してもらった。snapshot版で修正済み。ちなみにsvnからtrunkとると、これはGroovy 1.6用らしいので注意。branches/1_1_Xが、Groovy-1.5用のようだ。ってことはGroovyは1.6で、結構互換性にヒットする修正が入るのね。

あ、あとshell()呼び出しには、Cygwin必要(というかshが必要 )みたい。前、無くても動いたような気がしたんだけど、気のせいだった。今回、Vanilla Windows2000で確認。こういう時、Vanilla WindowsをVMWareイメージで保管しとくと便利だな。

ww.google.co.jp

リファラ見ていて気付いたんだけど、w.google.co.jpとかww.google.co.jpとかでも、いいんだね。

Gantの単体テストが通らない件。

なんだかねぇ。まぁ、Gantのビルドファイルを生成して、それを食わせてってやっているから仕方無いんだけど。

まずWindows環境では、絶対通らない。パスセパレータの問題。いや、ちゃんとね File.pathSeparator使っているんだけどさ、ビルドファイルを生成する時に'c:\xxx'とかになっちゃうんで、\xがエスケープシーケンスと思われちゃうんだよね。

あと空白入りのファイルがWindowsだと、ショート名(DOSとかのために、空白が入らないようしたやつ)と、普通(?)のがあって、それが一致しないんでテスト失敗になるところがある。どうもFileでは、getAbsolutePath()が、前者を、getCanonicalPath()が後者を返すようなんだけど、Gantはエラーメッセージでは後者を、テストケースの中では前者を使ってるんで、一致しない。

で、file not foundみたいなエラーメッセージでassert()してるんで、日本語環境だとエラーメッセージも日本語になってテストが通らない。

困ったもんだ。もとはと言えば、xjcをExecute.shell()したら、ストリームが詰まる問題で、Windowsだとハングるんで、パッチでも送るかと思い、単体テストを流したことから始まったんだよな。あやうく最初の目的忘れるところだったよ。というか、すっかり萎えてしまって、どうでも良くなってきてしまった。

P.S. とりあえずMLに投げてみたら、速攻で修正してくれた模様。良かった良かった。

テンペストを更新。

テンペストを更新。第2楽章に音の違うところを見つけたのと、タイミングの再調整(第1、2楽章)。

Groovyで子プロセス起動

gantのソース見ていて気付いたわけだけど、文字列配列とか、文字列に対して、execute()を実行すれば良いようだ。Groovy JDKにも載っているね。Groovy JDKではString[]というのが、1つのエントリになっているのか。

gantのソースを元に作成すると、こんな感じになるんだけど、

def process = ['ls', '-l', '/etc'].execute()
//def process = 'ls -l /etc'.execute()
process.err.eachLine {println it}
process.in.eachLine {System.err.println it}
def ret = process.waitFor()

確かに、これはLinuxだと、一見問題無く動く。でもWindowsだとハングする。これってストリームが詰まる問題だよね。Linuxはストリームのバッファが、かなり大きいようで問題が顕在化しないだけじゃないかな。

Thread.start {
    process.err.eachLine {println it}
}

とすれば良さそうだ。簡単に書けていいんだけどさ、クロージャ経由って、Javaメモリモデルの問題とか、どうなるんだか、さっぱり見えないから。なんか怖い。

NetBeansのメモリプロファイラ

なんか変だなと思ったら、これは開始から生成されたオブジェクトの累計なんだね。てっきり、今、参照が切れずに生きているオブジェクトが見えているのかと思っていたんで「げ、メモリリーク?」とあわててしまったよ。

bashのlftpとssh

puttyとpsftpでも、目的は果たせるんだけど、lftpに慣れてしまうと素のftpは辛すぎる。

あらかじめCygwinでlftpとopen-sshを導入しておく。

Cygwinインストールディレクトリの下のhome/自分のidの下に.sshディレクトリを作成。

puttygenで、普段使っているprivate keyをloadする。

ConversionsメニューからExport OpenSSH keyを選択。保管場所は、上で作った.sshディレクトリの下にid_dsaという名前で。

あとは、lftp sftp://xxxでok。user userIDでパスワードを聞かれたら、パスフレーズを入力。

PMD

バグの指摘に関しては、少々的外れなものが多いけど、コピペ検出機能はイケてるね。

NetBeans 6.0.1のJFileChooser

Swingアプリケーションで残念なのが、JFileChooserがショボいこと。ところがNetBeans 6.0.1の「プロジェクトを開く」が、ちょっといい感じだ。ちゃんと入力フィールドにキーを入力していくと、候補が表示される。ところが「ファイルを開く」の方だと、いつものショボいJFileChooserのようだ。で、これってNetBeans独自の作り込みなのかなぁ、と思って「プロジェクトを開く」でスレッドダンプをとってみたら、

"AWT-EventQueue-1" prio=10 tid=0x00002aaae0044800 nid=0x1e44 in Object.wait() [0x000000004233c000..0x000000004233dca0]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00002aaabcea4a98> (a java.awt.EventQueue)
        at java.lang.Object.wait(Object.java:485)
        at java.awt.EventQueue.getNextEvent(EventQueue.java:479)
        - locked <0x00002aaabcea4a98> (a java.awt.EventQueue)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:245)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:177)
        at java.awt.Dialog$1.run(Dialog.java:1045)
        at java.awt.Dialog$3.run(Dialog.java:1097)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.awt.Dialog.show(Dialog.java:1095)
        at javax.swing.JFileChooser.showDialog(JFileChooser.java:723)
        at javax.swing.JFileChooser.showOpenDialog(JFileChooser.java:626)
        at org.netbeans.modules.project.ui.actions.OpenProject.actionPerformed(OpenProject.java:101)

ん〜、やっぱりJFileChooserなんだね。どうやるのかな。暇ができたら調べてみよう。

aspectjを検索すると、

jを落としたaspectも、ひっかかってウザい。勝手にjを落とすなよ〜、と思ったらダブルクォートで囲んで"aspectj"とすれば、大丈夫のようだ。へ〜、こんな用途でもダブルクォートを使うんだね。

猫ページ

猫ページ更新完了。

アキハバラデパート

建て替えか。感慨深いな。そういえば、ここ数年、古炉奈に行っていない気が。あそこのチーズケーキ(確か鎌倉山だっけ)うまいんだよね。

Groovyとstatic final

--- test.groovy ---

class Test {
    static final String HELLO = 'Hello'
    static {HELLO = 'World'}        
}

println(Test.HELLO)
shanai@shanai-laptop:/tmp$ groovy test.groovy
World

orz 定数には、ならんのね。
でも、これはどういうことだ??

println(Test.HELLO)
Test.HELLO = 'World'
shanai@shanai-laptop:/tmp$ groovy test.groovy
World
Caught: java.lang.IllegalAccessException: Can not set static final java.lang.String field Test.HELLO to java.lang.String
        at test.run(test.groovy:7)
        at test.main(test.groovy)

なんだか中途半端だな。

Commons CLI2

バージョン1は、なかなか荒削りな感じっだたけど(まぁ、あれは、あれで単純明快で好きではあった)、CLI2は、抽象化が進んでいて良くなっている。ようやくエラーメッセージを日本語でできるようになったかな。とはいえHelpFormatterは文字幅をString.length()でとって、フォマッティングするから、日本語は、ずれまくるけど。

ちなみにCLI2は、まだバイナリでの配布は無い模様。

svn co http://svn.apache.org/repos/asf/commons/proper/cli/trunk

でソースを取得して、antでビルドする必要がある。

NetBeans 6.0.1

知らない内に6.0.1になってた。プロファイラが標準で組み込まれた模様。

PMDをアプリケーションから呼び出して使う。

意外と簡単。

Parser parser = new Java14Parser();
ASTCompilationUnit acu = (ASTCompilationUnit) parser
        .parse(new FileReader("src/Sample.java"));

とやってパーサに読み込ませれば、ツリー構造が出来上がり。acu.dump("");すれば内容が確認できる。こんなクラスをパースさせると、

public class Sample {
    int foo(int i) {
        return java.lang.Integer.MAX_VALUE + 1;
    }
}

こんなのが出来上がる。

CompilationUnit
 TypeDeclaration
  ClassOrInterfaceDeclaration(Sample)(class)
   ClassOrInterfaceBody
    ClassOrInterfaceBodyDeclaration
     MethodDeclaration:(package private)
      ResultType
       Type
        PrimitiveType:int
      MethodDeclarator:foo
       FormalParameters
        FormalParameter:(package private)
         Type
          PrimitiveType:int
         VariableDeclaratorId:i
      Block
       BlockStatement
        Statement
         ReturnStatement
          Expression
           AdditiveExpression:+
            PrimaryExpression
             PrimaryPrefix
              Name:java.lang.Integer.MAX_VALUE
            PrimaryExpression
             PrimaryPrefix
              Literal:1

で、特定の構造に着目したい時はビジタパターンで抜き出すことができる。たとえばimport文を調べたい場合は、以下のようにすれば良い。

JavaParserVisitorAdapter visitor = new JavaParserVisitorAdapter() {
    public Object visit(ASTImportDeclaration node, Object data) {
        // ...
        return super.visit(node, data);
    }
};
visitor.visit(acu, null);

ThinkPad + Ubuntu 7.10で音量調整できない。

ここの解決方法で直った。

今のところ問題は、スタンバイが勝率7割くらいなところか。ハイバーネートは、復帰に1分くらいかかるんで、正直立ち上げ直した方が速いような...

依存性調査

クラス間の依存性を調査するツールをBCELで作った。でもバイトコード見てるだけだから、定数参照が出力されない罠。やっぱソースも見ないとダメか。

DB2でLOADできるデータがIMPORTできない。

LOADの場合、キー重複があると単に削除されるだけなのが、IMPORTの場合はエラーになるようだ。

このサイトの掲載内容は私自身の見解であり、必ずしもIBMの立場、戦略、意見を代表するものではありません。
日本アイ・ビー・エム 花井 志生 Since 1997.6.8