SSブログ

Netbeans で groovy の execute が文字化けする [groovy]

Netbeans 6.9.1 上で groovy を使っていて、あるコマンドを execute した結果を取得した場合、 Groovy Version: 1.7.6 JVM: 1.6.0_23、Windows 7 Pro 64bit な環境では文字化けしてしまう。 例えば、dir コマンドの結果を取得したい場合、通常なら次のように記述できる。
"cmd /c dir /s /b D:\\".execute().text.eachLine {
  println it
}
しかし、同じコードをコマンドプロンプトで実行した場合は問題ないが、Netbeans 6.9.1 で実行すると文字化けしてしまう。

幸いなことに回避策を見つけたので、メモしておく。
InputStream cmdIn = "cmd /c dir /s /b D:\\".execute().in
BufferedReader reader = new BufferedReader(new InputStreamReader(cmdIn, "SJIS"));
reader.text.eachLine {
  println it
}
出力結果を InputStreamReader で取得して文字コードを指定すれば問題ないようだ。
タグ:Groovy Java

groovy.exe は日本語を引数に受け取れないバグがある [groovy]

Windows 7 Professional 64bit 上の Groovy 1.7.6 groovy.exe には日本語を含む引数を与えると文字化けしてしまうバグがある。

F:\TMP>groovy.exe -v
Groovy Version: 1.7.6 JVM: 1.6.0_22

F:\TMP>groovy.exe -e "println args[0]" こんにちは
?±?

例えば、日本語を含むファイルパスをスクリプトの引数に与えたいとすると、文字化けしてしまい正しいパスが渡らない。

幸いなことに回避策があり、groovy.exe ではなく、groovy.bat ならこの問題は生じない。

F:\TMP>groovy.bat -v
Groovy Version: 1.7.6 JVM: 1.6.0_22

F:\TMP>groovy.bat -e "println args[0]" こんにちは
こんにちは

この問題は ITS にも [#GROOVY-3562] groovy cannot read Chinese character in command line parameter properly - jira.codehaus.org と登録されており fixed/closed となっている。しかし、実際には直っていない。 どうやら、groovy.exe はコマンドラインから渡されたストリームを UTF-8 と見なしているようだ。

ちなみに、Windows (少なくとも Windows 7 Pro 64bit では)のコマンドプロンプトで文字コード(コードページ)を変更するには chcp コマンドを使う。 UTF-8 にしたいなら chcp 65001 とする。 chcp を引数なしで実行すると現在のコードページが表示される。

F:\TMP>chcp
現在のコード ページ: 932
ともあれ、結論としては、groovy.bat を使った方が無難だろう。

groovyConsole に jar を追加するには? [groovy]

Windows 7 Pro 64bit、Groovy Version: 1.7.6 JVM: 1.6.0_22 において、groovyConsole には不具合があり、メニューから追加した jar が認識されないようだ。

groovyConsole には script メニューから jar を追加する機能がある。

groovyconsole.png

この機能が正常に動作していないようだ。

回避策は Groovy をインストールしたディレクトリにある lib ディレクトリに使いたい jar をコピーしておくこと。

例えば、nekohtml.jar と xercesImpl.jar を使用したくて、Groovy を E:\Program Files (x86)\Groovy\Groovy-1.7.6 にインストールしたのであれば、 E:\Program Files (x86)\Groovy\Groovy-1.7.6\lib に jar をコピーしておけば良い。


タグ:Groovy Java

次期バージョン(1.8.0)の Groovy はパフォーマンスがかなり向上する模様 [groovy]

海外の blog で Groovy/Java/Scala のクイックソートでのパフォーマンスの比較結果が公開されている。

最終的な結果は 2 つ目の Groovy++ Performance - Now we're talkin' で紹介されている。

それによると、Java にかなり近いパフォーマンスを得られたようだ。現在のバージョンと比較すると 300倍くらい速くなっている。

Groovy で Web サービスを作成しても、パフォーマンス的には余り問題なら無くなるかもしれない。

ただ、JVM (Java Virtual Machine、Java 仮想マシン) 上で動作する言語は、非常に起動が遅い。これは Groovy、Scala、JRuby  などどれも同じだ。これは JVM の問題であり、Sun はこれを少しでも改善するために Java Quick Starter (jqs.exe) を用意して、高速化を図っているがまだ改善の余地がある。

シェルスクリプトの代わりに Groovy で作成したスクリプトを動かすとその差は顕著に感じる。起動してからの実行時間はシェルスクリプトより高速化もしれないが、それまでが...。

回避策としては、

辺りで紹介されているように、Groovy のプロセスを起動させたままにするという方法がある。

これはこれで、妥当な回避策であるが、例えば、レンタルサーバでの利用を考えると、長時間プロセスを起動させたままにすることができず使えない。ちょっと微妙。


タグ:Groovy

Groovy の日本語の情報源は? [groovy]

Groovy の日本の情報源は少ない。特に書籍は 2 冊しかない。

Groovyイン・アクション

Groovyイン・アクション

  • 作者: Dierk Konig
  • 出版社/メーカー: 毎日コミュニケーションズ
  • 発売日: 2008/09/27
  • メディア: 単行本(ソフトカバー)
Grails徹底入門

Grails徹底入門

  • 作者: 山田 正樹
  • 出版社/メーカー: 翔泳社
  • 発売日: 2008/08/26
  • メディア: 大型本

Grails 徹底入門は正確には Groovy の本ではなく Grails という Groovy を利用したフレームワークの入門書だ。ただし、Groovy の基本的な文法などは簡潔にまとめられている。

雑誌記事としては

Java World (ジャバ・ワールド) 2004年 11月号

Java World (ジャバ・ワールド) 2004年 11月号

  • 作者:
  • 出版社/メーカー: IDGジャパン
  • 発売日: 2004/09/24
  • メディア: 雑誌

に 25 ページくらいの特集が掲載されている。本誌は既に休刊しており本として手に入れるよりも、

JavaWorldメモリアルDVD

JavaWorldメモリアルDVD

  • 作者:
  • 出版社/メーカー: アイ・ディ・ジー・ジャパン
  • 発売日: 2007/06/22
  • メディア: 大型本

を購入した方が良いかもしれない。 Java World メモリアル DVD には Java World 2004 年 11 月号の Groovy の特集も収録されている。

Java World 誌は 2004 年 11 月なので 5 年くらい経過しており、内容が古い面も多いが、基本的な文法はほぼ現在も同じだ。概要をつかむには問題ないだろう。

他には

Web+DB press (Vol.24)

Web+DB press (Vol.24)

  • 作者:
  • 出版社/メーカー: 技術評論社
  • 発売日: 2004/12
  • メディア: 単行本

に 9 ページにわたり紹介記事が掲載されているがページ数が少々物足りない感じ。こちらの雑誌を購入するよりは、今なら縮刷版

WEB+DB PRESS 総集編 [Vol.1~36]

WEB+DB PRESS 総集編 [Vol.1~36]

  • 作者:
  • 出版社/メーカー: 技術評論社
  • 発売日: 2007/03/30
  • メディア: 大型本

があるので、 WEB+DB PRESS 総集編 [Vol.1~36] を選ぶことをお勧めする。

 

結論としては、日本語の Groovy の本を買うなら Groovyイン・アクション しか選択肢が無いよ!と言うこと。もう少し普及しないかな :-。


タグ:Groovy

Groovy から e-mail を送信するには? [groovy]

Sh*tmores: Missing Groovy Recipe: Send e-mail from Groovy で紹介されているように AntBuilder を使うと簡単にできる。

上記 blog でのコメント欄にもあるけれどgrails を使っている場合は AntBuilder ではなく Grails - Mail Plugin を使った方が容易だろう。

シェルスクリプトを書く代わりに Groovy で簡単なツールを書く者にとっては Grails のプラグインでない AntBuilder の方が使い安い。

ただ、幾つかライブラリを用意する必要がある。ライブラリを CLASSPATH に設定しないと

[mail] Failed to initialise MIME mail: org.apache.tools.ant.taskdefs.email.MimeMailer

と表示されてメールを送れない。ライブラリは次の場所から入手できる。

それぞれ、JavaMail と JavaBeans(TM) Activation Framework、Apache Ant である。

ソースコードを UTF-8 で書いていて、メールの本文も UTF-8 にしたいのなら charset を指定すればよい。以下サンプル。

param1 = "だよね orz.."

ant = new AntBuilder()
ant.mail(mailhost:'mail.example.com', mailport:'25', subject:'日本語のテスト', charset:'utf-8'){
from(address:'experiment@example.com')
replyto(address:'experiment@example.com')
to(address:'experiment@example.com')
message(
"""日本語のテスト
ヒアドキュメント便利 ${param1}
""")
}

Groovy だから ${変数名} で変数を差し込めるし、ヒアドキュメントも使える。先に紹介した blog ではファイルの添付方法も紹介している。

最終的に、ソースコードを UTF-8 で mail.groovy にしたなら、

groovy -c utf-8  -cp "I:\lib\activation.jar;I:\lib\mailapi.jar;I:\lib\smtp.jar;I:\lib\ant-javamail.jar" mail.groovy

でとすれば良い(各種ライブラリのパスは各自で適切に変えて頂きたい)。

メールサーバの認証方法はいろいろあるが、POP before SMTP だと、上記のスクリプトのままでは POP してくれないので、認証に失敗してメール送信できない。その場合は、POP してメールを受信(受信せず、メールがあるかないか調べるだけでも可)するコードを書くか、Thunderbird などで一旦、受信しておいて、そのアカウントを用いてメール送信すれば良い。少なくとも so-net は可能だった。

Ant の Mail タスクのマニュアルは Mail Task にある。このマニュアルは XML ファイルとして設定をどのように記述するか述べたものだから、Groovy で実装する場合は注意されたい。

筆者の場合 charset:'utf-8' と書くべきところを charset='utf-8' と書いて、

Caught: The <mail> type doesn't support nested text data ("utf-8").

と表示されて何が悪いか直ぐ分からなかったので...

参考文献


タグ:Mail Groovy

Groovy で正規表現にマッチした箇所を抜き出すには? [groovy]

groovy で正規表現にマッチした箇所を抜き出すには次のように記述する。

    matFile = (file =~ /^([0-9a-zA-Z\-]+) (.*).mp3/);
    if (matFile.matches()) {
        id = matFile[0][1]
        title = matFile[0][2]
    }

この場合、file が 「AAb-32D なんかのタイトル.mp3」であれば、

  • id = AAb-32D
  • title = なんかの タイトル

を取得できる。もし、file が 「日本語 なんかの たいとる.mp3」のときは、 正規表現にマッチしないため、id、title には設定されない。

id が英数字からなるものの 場合は [0-9a-zA-Z] とすれば良い。

先に示した正規表現では「~」 が先頭に付与されているので 「 AAb-32D たいとる.mp3」のように、先頭に空白など英数字(と「-」)以外の文字がある場合はマッチしない。


Groovy からプログラムを実行するには? [groovy]

Groovy でちょこちょこコードを書くことがあり、せっかくなので忘れないようにメモしておく。

Groovy から任意のプログラムを実行する(サブプロセスを起動するとか子プロセスを起動するとも呼ばれるが、本エントリでは区別しない)には、次のように記述する。

    str = "wget http://www.example.com/"
Process p = str.execute()
p.waitFor();

ここでは、wget と言うプログラムを http://www.example.com/ を引数として実行している。

実際に実行するのは execute() で、String クラスのメソッド。Process を返し、Process.waitFor() メソッドを用いると実行したプログラムが終了するのを待つことが出来る。

waitFor() を明示的に呼び出さない場合は非同期実行になるっぽい。

ちなみに、Windows の dir は cmd (コマンドプロンプト) の組み込み関数なので、dir を使う場合は次のように記述する。

    "cmd /c dir".execute()

dir は指定したディレクトリに含まれるファイルのリストを表示するコマンドなので、普通は dir した結果を利用する。この場合は、

    "cmd /c dir /b C:\\someDirectory".execute().text.eachLine {
println it
}

と記述すれば、ファイルリストの各ファイルパスを参照できる。dir の他にも cmd の組み込み関数はあるので注意されたい。

参考文献


この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。