Česky   |  Deutsch   |  English   |  Español   |  Français   |  Indonesia   |  日本語   |  한글   |  Polski   |  Português (BR)   |  Türkçe   |  中文   |  正體中文   |  Your Language  
PlanetNetbeans
プラネット NetBeans には、ブロゴスフィアの各所から集められた、NetBeans に関連する概念やアイデアがあります。
しんさんの出張所 はてな編 - May 16, 2008 12:00 AM
[Java][NetBeans]最後にOpenJPAで日本語が通るか試してみた

NetBeansのライブラリへ登録して、EJB-jar、warともに組み込む。ライブラリサイズはHibernate EntityManagerよりはるかに小さい。

そしてpersistence.xmlのJPAベンダを切り替え。これはNetBeans6.1だとドロップダウンリストを選択するだけなので非常に楽チン。


・・・結果成功!日本語の扱いに問題があるのはTopLink & EclipseLinkだけということになった。


ログが一切書き出されていないようなのでそれを表示。

persistence.xmlのpropertiesに追加する。

<property name="openjpa.Log" value="DefaultLevel=INFO,SQL=TRACE"/>

これでSQLが表示される。

生成されるSQLを見る限りHibernate EntityManagerのようにひどいSQLを発行することはないようだ。よしよし。

あとは悲観的ロックだが、Hibernate EntityManagerはやり方はわからなかったが、OpenJPAはちょっと調べればすぐにわかった。

まずpersistence.xmlのpropertiesに次の一文を追加する。

<property name="openjpa.LockManager" value="pessimistic"/> 

そして、発行時のヒントとして

setHint("openjpa.FetchPlan.ReadLockMode",LockModeType.READ)

を追加する。


生成されたSQLを見る限り「for update」が追加されている。おそらくこれで動いてると思う。


ちょっと触ってみた感じだと一番まともに動いてるのがOpenJPAという結論になった。GlassFishとの相性が悪いTopLinkから差し替えていい気がする。

というか、TopLink(とEclipseLink)はGlassFishのコンポーネントのひとつなのに相性が悪いというのがおわっとる。

まとめるとこんな感じ

JPAベンダ発行されるSQLライブラリサイズ悲観的ロック日本語LAZY
TopLink Essentials & EclipseLink(NetBeansやGlassFishのデフォルト)×
Hibernate EntityManager××
OpenJPA

OpenJPAは日本語の資料ほぼゼロというあたりがアレだが、Apacheプロジェクトの中ではかなりまともな部類に入るような気がする。

人工無脳が作りたい - May 15, 2008 10:07 AM
[NetBeans]すごく、ほしいもの。

ぼく、とっても欲しいものが有るんだ。


まずは↓の画像を見て欲しい。

http://www.flickr.com/photos/okazaki/2491033867/in/set-72157594144301548/

http://www.flickr.com/photos/okazaki/2491850808/in/set-72157594144301548/

http://www.flickr.com/photos/okazaki/2491851706/in/set-72157594144301548/


ヤバイですよね?

ぼくは、しんじています。

しんさんの出張所 はてな編 - May 15, 2008 12:00 AM
[Java][NetBeans]せっかくなのでHibernate EntityManagerも日本語が通るか試してみた

Hibernate CoreとHibernate EntityManagerを落としてNetBeansへライブラリ登録。

依存ファイルも大量にあってファイルサイズがすさまじいのでデプロイ時間増加につながってちょっとイラつく。

persistence.xmlのベンダ設定のみを修正。ソースコードは一切かえずに実行!


・・・おおおおお、動いた!!!!!


NetBeansやGlassFishと最も相性のいいJPAのベンダはHibernate EntityManagerってことか。なさけないけど日本人なら日本語が問題なく通るほうを選ぶよね。TopLink & EclipseLinkだけの問題らしいということもこれで確定したかな。あとでOpenJPAも試してみよう。


HibernateはJPAの挙動が最も気に入らないので避けていた。LAZYの問題もあるし、トレースのログが見にくいし、なんといっても吐き出すSQLが一番へぼい。設定とかで変わるかもしれないけど、JPAでの利用においてはかなりへぼい。Hibernate EntityManagerの悲観的ロックの仕方もようわからないし。上であげたようにライブラリが大きすぎるのも開発に時間がかかるということなのでバツ。

JPAの範囲だけを使う場合、かなり欠陥だらけだと思うんだけど。



でも背に腹は変えられん。無理して使うか。

まともなSQLを返す設定方法と悲観的ロックの仕方がわかればとりあえずのりかえてもいいかも。LAZYはJPAの範囲に収まらないけど一応解決方法があるようだし。

しんさんの出張所 はてな編 - May 15, 2008 12:00 AM
[java][NetBeans]EclipseLinkで日本語が通るか試してみた

ライブラリを眺めていたらEclipseLinkがあった。


入れた記憶もないのだが、ディレクトリを見るとGlassFish V3TP2をインストールするとここに追加されるようだ。

そういやTopLink Essentialsは日本語の扱いに問題があるのだが、EclipseLinkでは直っているのか気になった。そこで試してみることに。



JPAのウィザードのところにも自動的に検出されているようだ。


ここでEclipseLinkを選び、ライブラリをejb-jarとwarのプロジェクトにそれぞれ追加する。あくまでもremoteのテストなのでearは今回は触らない。パッケージングするとremoteセッションビーンでもLocalと同様の扱いになるためだ。


実行。

com.sun.rave.web.ui.appbase.ApplicationException: nested exception is: java.rmi.RemoteException: CORBA DATA_CONVERSION 1330446337 No; nested exception is: 
        org.omg.CORBA.DATA_CONVERSION: ----------BEGIN server-side stack trace----------
org.omg.CORBA.DATA_CONVERSION:   vmcid: OMG  minor code: 1  completed: No
        at com.sun.corba.ee.impl.logging.OMGSystemException.charNotInCodeset(OMGSystemException.java:2093)
        at com.sun.corba.ee.impl.logging.OMGSystemException.charNotInCodeset(OMGSystemException.java:2111)
        at com.sun.corba.ee.impl.encoding.CodeSetConversion$JavaCTBConverter.convertCharArray(CodeSetConversion.java:336)
        at com.sun.corba.ee.impl.encoding.CodeSetConversion$JavaCTBConverter.convert(CodeSetConversion.java:249)
        at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.writeString(CDROutputStream_1_0.java:504)
        at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_string(CDROutputStream_1_0.java:493)

EclipseLinkもTopLink Essentialsと同様に日本語のフィールドがあるとだめみたい。まったく同様の現象から日本語のプロパティ自体はうまくいくと思われる。また、EJB単体でもうまくいくはず。

JPAを使う範囲においてはEclipseLinkとTopLink Essentialsは同様だと思っていいみたい。まだ1.0の実装だしね。

NetBeans - May 14, 2008 02:22 PM
[NetBeans][Java]Alt + Insertで出るコードジェネレーションをカスタマイズ

NetBeans6系で気に入ってる機能の1つ!Alt + Insertでコードを色々生成出来るってのがある。
エディタ上でAlt + Insert(若干押しにくい)を押すと下のようなものが出てくる
image

ここから生成したいコードを選ぶと、さくっとコードが出力される。
例えば、equals() and hashCode()...を選ぶと
image

どのフィールドを対象にするかを選択するダイアログが出てきて
image

こんな感じのコードが出力される

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Employees other = (Employees) obj;
        if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
            return false;
        }
        if (this.name != other.name && (this.name == null || !this.name.equals(other.name))) {
            return false;
        }
        if (this.entDate != other.entDate && (this.entDate == null || !this.entDate.equals(other.entDate))) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 19 * hash + (this.id != null ? this.id.hashCode() : 0);
        hash = 19 * hash + (this.name != null ? this.name.hashCode() : 0);
        hash = 19 * hash + (this.entDate != null ? this.entDate.hashCode() : 0);
        return hash;
    }

これをカスタマイズしてみようと思う。

 

プロジェクト作成

まず、モジュールのプロジェクトを作成する。名前は何でもいいけど、とりあえずinsertという名前にした。
パッケージはcom.wankuma.kazuki.insertにしておいた。layer.xmlを使うので生成するようにしておく。

そして、ライブラリに以下の3つを追加する。Java Editorのほうは、公式に公開されてるものじゃないみたいなので、Non-API Modulesからみつけるようにする。

  1. Javac API Wrapper
  2. Java Editor(Show Non-API Modulesにチェックを入れないと出てこない)
  3. Java Source

そして、ここでもう一手間。
これから使うクラスは、まだ公開されてないということなので、無理やり使うように設定する。
Java Editorで右クリックしてEdit...を選択する。

出てきたダイアログで、Specification VersionからImplementation Versionに変更する。
image

 

Let's プログラミング!

そしたらおもむろにクラスを作成する。名前はcom.wankuma.kazuki.insert.HelloCodeGeneratorにする。
そしてorg.netbeans.modules.java.editor.codegen.CodeGeneratorをimplementsする。

package com.wankuma.kazuki.insert;

import javax.swing.text.JTextComponent;
import org.netbeans.modules.java.editor.codegen.CodeGenerator;

public class HelloCodeGenerator implements CodeGenerator {

    public String getDisplayName() {
        return null;
    }

    public void invoke(JTextComponent textComponent) {
    }

}

getDisplayNameはAlt + Insertのときに表示されるテキスト。invokeは、実際の挿入処理を行うみたい。
さくっと実装してみた。

    public String getDisplayName() {
        return "Hello world";
    }

    public void invoke(JTextComponent textComponent) {
        // キャレットの位置を取得して
        int mark = textComponent.getCaret().getMark();
        try {
            // そこに適当な文字列を挿入する
            textComponent.getDocument().insertString(
                    mark, "System.out.println(\"Hello world\");", null);
        } catch (BadLocationException ex) {
            Logger.getLogger(HelloCodeGenerator.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

そして、Generatorを生成するためのファクトリクラスを作成する。
とりあえずHelloCodeGeneratorの内部クラスにする。

public class HelloCodeGenerator implements CodeGenerator {

    // ファクトリクラス!
    public static class Factory implements CodeGenerator.Factory {
        // Iterableを返すらしいので、さくっとね
        public Iterable<? extends CodeGenerator> create(CompilationController arg0, TreePath arg1) throws IOException {
            return Collections.singleton(new HelloCodeGenerator());
        }
        
    }
    
    public String getDisplayName() {
    // 以下略

}

後は、ファクトリクラスを、layer.xmlのEditors/text/x-java/codegeneratorsに登録する。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
<filesystem>
    <folder name="Editors">
        <folder name="text">
            <folder name="x-java">
                <folder name="codegenerators">
                    <file name="com-wankuma-kazuki-insert-HelloCodeGenerator$Factory.instance" />
                </folder>
            </folder>
        </folder>
    </folder>
</filesystem>

これで完成!!

 

実行してみよう

F6を押して実行!テスト用NetBeansが立ち上がる。

適当にJavaのプロジェクトを作成してJavaのコードエディタ内でAlt + Insertをしてみると....
image

出た!!選択すると…
image

お~出た~。
こんな手軽にいけるなら、がんがん俺様フレームワークのスニペットみたいなのを作れるんじゃないだろうか。
単純に固定区を入れるものから、設定ファイルからコード生成するものとか…

夢は広がる。

marsのメモ - May 14, 2008 01:57 PM
[NetBeans] Ruby on Rails用 統合開発環境(IDE) 比較レポート:CodeZine

よく調べたなぁと感心しつつも,NetBeansのデメリットに >http://codezine.jp/a/article/aid/2482.aspx?p=2:title> 短所 IDE起動後の索引作成に時間がかかる JavaのIDEとしてデファクトスタンダードであるEclipseではないため、見た目、操作感が違い戸惑う可能性がある ってあるけど,それってあんまりジャマイカ? #ヒドイ言いがかりだ。:-P

Masaki Katakai's Weblog - May 14, 2008 07:05 AM
NetBeans 6.1 ブログコンテスト結果発表 : 高倉さん、おめでとう!

NetBeans 6.1 Beta のブログコンテストですが結果の発表がありました。みなさま、ご応募ありがとうございました。

日本語では昨年の JJUG カンファレンスで NetBeans コミュについて LT してくれた高倉さんの PHP に関する記事が選ばれたようです。おめでとうございます!
高倉さんは翻訳プロジェクトのほうにも参加してくれていて wiki.netbeans.org にある英語のドキュメントを日本語にしてくれています。いつもありがとー!

Masaki Katakai's Weblog - May 14, 2008 05:56 AM
Sun Business .Next 2008 の資料が公開されました : NetBeans

先月行われた Sun Business .Next 2008 の資料が公開されました。当日はたくさんの方にご来場いただき本当にありがとうございました。 私からは NetBeans の概要に ja.netbeans.org のマスコット ねこび〜ん と、



ねこび〜ん作者の金内さんと、



ねこび〜ん実物第1号を試作してくださった宗形さん



ご紹介させていただきました。ありがとうございました!

しんさんの出張所 はてな編 - May 13, 2008 12:00 AM
[Java][NetBeans]Seasar2とSpringでいまいちサーバー管理のJPAの使い方が分らない

まずRESOURCE_LOCALとかnon-jta-datasourceとかがはいってるwarやejb-jarはGlassfishがデプロイ時にはじくので環境がかなり狭められてしまう。

そしてSpringやSeasar2のサポートするJPAは独自のJPA管理ということで躊躇してしまう。アプリ側のコンテナ依存はしかたないにしても、JPAやデータソースは鯖側で持っていてほしい情報だ。そこをアプリ側で持つのは我慢できない人は多いと思う。

Glassfishの管理ツールでjndi一覧を見る限りEntityManagerはjndiで取得することはできなさそう。

やはりJPAを使うならEJB3が一番だということか。Glassfish+Toplinkで日本語が通らない問題さえ解決すればべつにこだわる必要はないのだが。

もっともJPAを扱う場合NetBeansはEJB3の開発効率は割といいので本当は日本語問題が解決されるのが一番なのだが、ここは正直期待できない部分なので回避方法を探すしかない。


シングルバイト圏とくらべてこういった部分だけでもかなりハンデだなー。


そこでJSFでは@EJBがきくことから、他のリソース系もインジェクトされるかどうか確かめてみた。

Visual Web JSFを起動して確かめる。Visual Web JSFはJSFのRIを使いつつもさらに薄いラッピングをしている一種のフレームワークだ。NetBeansのGUIエディタのようにボタンを貼り付けてそのイベントを書くだけでWebアプリを作ることが可能だ。

そこのイベントにコードを書いてみる。

    @PersistenceContext
    EntityManager em;

    @Resource
    UserTransaction ut;

    //ボタンクリックイベント
    public String button1_action() {
        
        try {
            ut.begin();

            Customer c = new Customer();
            c.set得意先名("なまえ");
            c.set電話番号("TEL");
            em.persist(c);

            ut.commit();
        } catch (Exception ex) {
            Logger.getLogger(Page1.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

まったく問題なく動いた…。

シンプルにアプリを書く場合悪くはないな。トランザクション管理はコンテナがやってくれるのが一番だが小さいアプリを書いたりそこまでやる必要としない場合はこれでいいかもしれない。ejb-jarが必要としないのでシンプルに扱える。

通常Visual Web JSFのロジックはセッションスコープのマネージドビーンにおいておくのが普通だ。そうなるとインジェクトしたEntityManagerの動きがどうなるかが怪しく感じるかもしれない。

そこでGlassfishのソースを調べてみた。NetBeansでコンパイルの仕方が分らないのでデバッグ用のログも吐き出すことができず、エディタで開いての机上デバッグのみとなる。それでも、実際に動かしててどの用になるのか調べる必要が出てくる。

そこでリフレクションだけでひたすら追ってみた。フィールド変数までしか終えないが、getDelegate()とかを使うとトレースできないからだ。

たとえば一部を取り出したりするとこんな感じになる。

            try {

                Method method = em.getClass().getDeclaredMethod("_getDelegate");
                method.setAccessible(true);
                method.invoke(em);
                
                Field field = em.getClass().getDeclaredField("txManager");
                field.setAccessible(true);
                Object obj =  field.get(em);
                System.out.println("txManager:"+obj);
                
                Method tran = obj.getClass().getMethod("getTransaction");
                System.out.println("transaction:"+tran.invoke(obj));

            } catch (Exception ex) {
                Logger.getLogger(SessionBean1.class.getName()).log(Level.SEVERE, null, ex);
            }

Object型だけでひたすらリフレクションで追うという、あほみたいに時間がかかることをしたのは俺だけでいい。

getDelegate()やその他のメソッドは毎回生成されて初期化や後始末等されていて追えないので、_getDelegateを直接いじったりトレースしたりする必要が出てくる。


とりあえず軽く触って分ったのは、インジェクトされるEntityManagerはラッパであるということ。そしてEntityManagerをアクセスするたびに本来のEntityManagerが生成されるということ。

あとUserTransactionのcommitまたはrollbackでこれら取得した本来のEntityManagerがcloseされるようだ。

この場合EJB3でのユーザー管理のトランザクションと同じ動きなのでたぶん問題はない…はず。


ということはこのインジェクトをSpringやSeasar2のコンポーネントに対しても行うことができれば手軽にアプリケーションサーバー管理のJPAを扱うことができるはず。そうすれば日本語問題も解決しなくてもなんとかなるかな。

marsのメモ - May 12, 2008 01:26 PM
[NetBeans] NetBeans6.1を試す

まずは見た目を自分好みに調整。IntelliJと設定できる項目がビミョーに異なるけど,それっぽくすることはできた。なによりBDF M+のちっこい方のビットマップフォントが使えて満足。 f:id:masanobuimai:20080512220333p:image 気になった点を上げる(主にダメ出し)。 foldingの余白のせいで,エディタの行頭位置がわかりづらいね。 NBのツールウィンドウの使い勝手がいまいち(単にあたしがIntelliJに慣れてるからって話か)。 なるほど,プロジェクトウィンドウ閉じると,パッと見,そのファイルがどこにあるのかわからんってことに気づいた。 ちょっとブランクあったけど,まだNetBeansは使えるし,人に使い方も教えられる。でもEclipseはすっかりご無沙汰になってしまって,今やどうやって使うのかもあやしくなってきたな。:-P

Masaki Katakai's Weblog - May 12, 2008 12:24 PM
ねこび〜んの「ネットビーンズトラベル」が NetBeans.tv に!

ねこび〜んの「ネットビーンズトラベル」が NetBeans.tv に載りました! NetBeans チームにとても気に入ってくれた人がいて是非 NetBeans.tv に載せたいと連絡をもらっていたのですが、Hibiki さんが頑張って Flash をムービーにしてくれました、ありがとー!最初 Flash 版が載っていたのですがその時の NetBeans.tv のトップページを撮っておいたので載せておきますね。


Masaki Katakai's Weblog - May 12, 2008 12:03 PM
NekoBean's NETBEANS TRAVEL Movie on NetBeans.tv!

NekoBean's NetBeans Travel now on NetBeans.tv! Thank you very much Hibiki-san for preparing the movie! The original flash movie is here.

marsのメモ - May 11, 2008 12:32 PM
[NetBeans] John O’Conner’s Blog: Creating OpenOffice Extensions

「NetBeans使うとOpenOfficeのプラグイン開発が簡単だよ」というのなら,何でもいいからサンプルを載せてくれぃ。:-( いままでOpenOfficeはノーマークだったけど,Javaでプラグイン作れるんだったら,ちょっとチェックしておこうかな。

NetBeans - May 09, 2008 06:19 PM
[NetBeans][Java][plugin開発]FileSystemに登録したjarをプロジェクトのクラスパスに登録

1つ前の投稿とのあわせ技で、プラグイン内に埋め込んだjarファイルをプロジェクトの下のlibフォルダにコピーしてクラスパスに追加するということが出来る。
spring.jarをコピーして追加してクラスパスに追加するコードは下のようになる。

まず、プラグインのプロジェクトの適当なパッケージにjarを追加する。
ここでは、org/yourorghere/module3/spring.jarに置いたとして話を進める。

そして、layer.xmlに登録する。

<folder name="MyArchives">
    <file name="spring.jar" url="nbresloc:/org/yourorghere/module3/spring.jar"></file>
</folder>

後はコードで、コピって追加するだけ。

Project project = ....; // プロジェクトはどうにかしてとってくる
Sources sources = project.getLookup().lookup(Sources.class);
SourceGroup[] groups = sources.getSourceGroups(JavaProjectConstants.SOURCES_TYPE_JAVA);

// ファイルシステムからjarを取得
FileSystem fs = Repository.getDefault().getDefaultFileSystem();
FileObject springJar = fs.getRoot().getFileObject("MyArchives/spring.jar");

try {
    // libフォルダを作ってコピーする
    FileObject libDir = project.getProjectDirectory().createFolder("lib");
    FileUtil.copyFile(springJar, libDir, springJar.getName());

    // jarファイルをクラスパスへ追加する
    FileObject[] jars = libDir.getChildren();
    URL[] uris = new URL[jars.length];
    for (int i = 0; i < jars.length; i++) {
        uris[i] = FileUtil.getArchiveRoot(jars[i]).getURL();
    }
    ProjectClassPathModifier.addRoots(uris, groups[0].getRootFolder(), ClassPath.COMPILE);
} catch (MalformedURLException ex) {
    Exceptions.printStackTrace(ex);
} catch (IOException ex) {
    Exceptions.printStackTrace(ex);
} catch (UnsupportedOperationException ex) {
    Exceptions.printStackTrace(ex);
}

今日は、これがわかっただけで満足。
来週ものは作ろう。

NetBeans - May 09, 2008 05:28 PM
[NetBeans][Java]モジュールからプロジェクトのライブラリにjarを追加するには

NetBeansのモジュール側からjarファイルをプロジェクトのクラスパスに追加したかった!

ライブラリに登録してあるものに関しては、色々情報があったけど、jarファイルを直接登録する方法は、なかなか見つからなかったのでメモする。
ポイントとなるクラスは、以下の1つのクラス。

org.netbeans.api.java.project.classpath.ProjectClassPathModifier

このクラスのaddRoots(URL[] classPathRoots, FileObject projectArtifact, String classPathType)このメソッドで追加できた。
各々の引数には、下記の値を渡す。

classPathRoots:FileUtil.getArchiveRoot(jarファイルのFileObject).getURL()したもの
projectArtifact:プロジェクトのソースフォルダのFileObject
classPathType:ClassPathクラスに定義されている定数(COMPILEかな)

ということで、プロジェクトフォルダの下にlibフォルダにあるhoge.jarを追加する場合のコードは下のような感じになる。

Project project = ....; // ProjectはどうにかしてとってくるFileOwnerQueryとかで
Sources sources = project.getLookup().lookup(Sources.class);
// ソースフォルダ取得
SourceGroup sourceGroup = sources.getSourceGroups(JavaProjectConstants.SOURCES_TYPE_JAVA);

// jarのFileObjectを取得
FileObject libDir = project.getProjectDirectory().getFileObject("lib");
FileObject hogeJar = libDir.getFileObject("hoge.jar");
FileObject hogeArchiveRoot = FileUtil.getArchiveRoot(hogeJar);

ProjectClassPathModifier.addRoots(new URL[]{ hogeArchiveRoot.getURL() }, sourceGroup.getRootFolder(), ClassPath.COMPILE);

たったこれだけなのに午後いっぱいくらい使ってしまったorz
因みに参考情報:http://fisheye5.cenqua.com/browse/sailfin/tools/netbeans/sip/src/main/java/org/jvnet/glassfish/comms/netbeans/sip/module/SIPProvider.java?r=1.6