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

2015年11月4日水曜日

java.net.BindException: Address already in use: bind

【エラー】
glassfish起動時に発生。(アプリケーションは起動した)
java.net.BindException: Address already in use: bind
【概要】
起動時に使おうとしたポートが既に別アプリにて使用中。
他のアプリを停止する。
他に動いてなくてもたまに出る?
エラーは出てもアプリケーションは起動した。
【詳細】
サンプルコード
a
b
c
【残課題】

2015年10月30日金曜日

PrimeFacesコンポーネントが動かない!

【エラー】
PrimeFacesが動かない!
原因はバージョンの異なるjqueryの混在。
【概要】
(参考サイト)
http://www.primefaces.org/showcase/ui/message/growl.xhtml

で書かれている通りに、ソースを書いても想定通りに動かない。
具体的にはSelectOneMenuとcalendar。
画面にコンポーネントは表示されるがコンボボックスやカレンダーがポップアップ表示で出てこない。


 【詳細】
なし
<p:calendar id="saledate" value="#{aaa.sampleDate}"></p:calendar>
<p:selectonemenu id="seriesName" value="#{aaa.selected.titleId}">
<f:selectitems itemlabel="#{title.titleName}" itemvalue="#{title.titleId}" value="#{aaa.titleMsts}" var="title">
</f:selectitems>
</p:selectonemenu>


【原因】
自分が明示的に読み込んでいるjqueryとprimeFacesが独自に読み込んでいるjqueryの
バージョンが異なっており、primeFacesのイベントがことごとく無効になっていた。

primeFacesを使うときは注意。

【残課題】
なし

2015年6月15日月曜日

【JPA】プライマリキーが複合キーになっているエンティティを作成するときの注意

netbeansでデータベースからエンティティを自動生成した場合、外部キー設定に合わせて自動的に
テーブル間のマッピングも行ってくれます。

ただ、プライマリキーが複合キーのテーブルがマッピングに含まれているとそのままでは
デプロイ時にエラーとなってしまいます。

エラー内容はプライマリキーが複合カラムの場合は、マッピングするテーブルの双方に
joincolumnの設定をしなさい

という内容。

なので、@joincolumnのあのてーしょんを複合キーがある側のエンティティに追加すれば解決。

2011年8月9日火曜日

【java】JDialogのsetModal(boolean)とshow()

JDialogのsetModal(boolean)とshow()の関係。
setModal(true)の後にshow()するとJDialog呼び元の画面が触れなくなる、だけではなく
処理もshow()のところで停止する。

逆にsetModal(false)の後にshow()すると呼び元の画面は触れるし、呼び元の処理もそのまま進む。

まあ、当たり前なのかもしれないけど。

Modal=true
⇒呼び元触れない
処理止まる。

Modal=false
⇒呼び元触れる
処理進む。

Modal=falseの時はスレッドが別になるみたい。
ここら辺はいじる時は、一応意識しておいた方が良さそう。

2011年5月24日火曜日

エスケープシーケンスとStringのreplaceAllと、時々正規表現

以下のような動きになるらしい・・・
NG⇒replaceAll("\\","/")
OK⇒replaceAll("\\\\","/")

http://www.javaroad.jp/bbs/answer.jsp?q_id=20071227154908697


※replaceAllのリファレンス
public String replaceAll(String regex,
String replacement)

パラメータ:
regex - この文字列との一致を判定する正規表現
replacement - 一致するものそれぞれに置き換えられる文字列

置換文字列内でバックスラッシュ (\) とドル記号 ($) を使用すると、それをリテラル置換文字列として処理した場合とは結果が異なる場合があります。Matcher.replaceAll を参照してください。必要に応じて、Matcher.quoteReplacement(java.lang.String) を使用して、これらの文字に特別な意味を持たせないようにしてください。
http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/String.html#replaceAll(java.lang.String, java.lang.String)


Matcher.replaceAllの記載
正規表現 a*b、入力 "aabfooaabfooabfoob"、および置換文字列 "-" を指定した場合、その表現の正規表現エンジン上でこのメソッドを呼び出すと、文字列 "-foo-foo-foo-" が生成されます。
このメソッドを呼び出すと、この正規表現エンジンの状態が変わります。この正規表現エンジンを後続のマッチ操作で使用する場合は、最初に正規表現エンジンをリセットする必要があります。
http://java.sun.com/javase/ja/6/docs/ja/api/java/util/regex/Matcher.html#replaceAll(java.lang.String)

よくわからん…

2011年4月28日木曜日

jreのパスを指定して(jreのインストールをせずに)eclipseを起動する方法

eclipse.exeと同階層にあるeclipse.iniを編集する。
-startup
plugins/org.eclipse.equinox.launcher_1.1.0.v20100507.jar
-product
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.1.R36x_v20100810
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
-vm
C:/21_FukushiV2/jdk1.6.0_20/bin/javaw.exe ←ここでjavaw.exeのパスを直接指定
--launcher.defaultAction
openFile
-vmargs
-Dosgi.requiredJavaVersion=1.5
-javaagent:dropins/MergeDoc/eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
-Xms128m
-Xmx512m


クライアントのjreのバージョンは上げられないけど、最新版のeclipseを使いたい!というときなどに重宝します。
※注意:jreはインストールプログラムを実行するのではなくするのではなく、ファイルだけコピーしておく

2011年4月15日金曜日

javaでコマンドファイルを実行し、終了まで待機する。

javaでコマンドファイルを実行し、終了まで待機する場合、返ってくるProcessオブジェクトのwaitFor()メソッドで値が返ってくるのを待つ。


waitを使って監視しなくてもいいので楽かな。


------------------------------------------------------------------------------------------
        try {
            String[] cmd = new String[1];
            cmd[0] = "c:\\hoge.cmd”


            Runtime rt = Runtime.getRuntime();


            rt.exec(cmd);
            Process proc = rt.exec(cmd);
                //結果が返ってくるまで待つ。
                int exitValue = proc.waitFor();
                if (exitValue == 0){
                 return true;
                }
        }
        catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
e.printStackTrace();
}




------------------------------------------------------------------------------------------

Runtimeのexecコマンドは別プロセスを生成して処理を実行するので、コマンドの結果をもとに処理を行う場合はこの方法を使う。



2011年2月4日金曜日

【java】ポートを使った他端末との通信

サーバーとローカルでのソケット間通信の処理を書く際に、いつもWriterとReaderの選択をミスって時間かかってしまうので、メモしとく。

【送る側】
(MylogSend)
----------------------------------------------------------------
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.net.*;
public class MylogSend {
private static final String host = "000.000.000.000";
public static void main(String[] argv) throws Exception {
MylogSend.write("日本語もOK");
}
public static void write(String msg) {

        System.out.println(host + "に接続します。" );
        PrintWriter out = null;
        try {
            Socket socket = new Socket(host,514);
         // 出力ストリームを取得
            out = new PrintWriter(socket.getOutputStream(), true);
            out.println(msg);
            out.flush();

        } catch (UnknownHostException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        } catch (IOException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        }
        finally{
            if (out != null) {
                out.close();                
            }
        }
}
}
----------------------------------------------------------------

【受信側】
※コンソール落とすまでずっと受信し続ける
(Startup.class)
----------------------------------------------------------------
public class Startup {
    static receive_data rcdata;
    /**
     * @param args
     */
    public static void main(String[] args) {
        rcdata = new receive_data();
        
        if (args.length > 1) {
            rcdata.intPort = Integer.parseInt(args[0]);
        }
        rcdata.start();    
    }
}
----------------------------------------------------------------
(receive_data.class)
----------------------------------------------------------------
import java.io.*;
import java.net.*;
import java.sql.Time;
import java.util.Date;
public class receive_data extends Thread {
    Date time = new Date();
    public int intPort = 514;
    public String host =  "000.000.000.000";
    public receive_data() {
    }
    ServerSocket svsocket;
    public void receive() throws Throwable{
        InputStreamReader in = null;
        try {
            Socket socket = svsocket.accept();
            InputStream ois = socket.getInputStream();
            in = new InputStreamReader(ois, "SJIS");
            BufferedReader bf = new BufferedReader(in);
            time.setTime(System.currentTimeMillis());
            System.out.println(time.toString());
            String line;
            while ((line = bf.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        }
        finally{
            in.close();
        }
    }
    @Override
    public void run() {
        try {
            svsocket = new ServerSocket(intPort);
            System.out.println("クライアントからの接続をポート"+ intPort + "で待ちます。");
            while (this != null) {
                time.setTime(System.currentTimeMillis());
                System.out.print(time.toString() + "~");
                receive();
            }
        } catch (IOException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        } catch (Throwable e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        }
    }
}
----------------------------------------------------------------

2010年12月9日木曜日

【java】ant のfilesetにIDをつける

antでファイルをまとめて操作したいときに使うfilesetコマンド

これを毎回書くのではなく、IDをつけて先に宣言しておくことで簡単に呼び出すことができるらしい。

宣言方法


<fileset dir="${build.outdir}/${class.pkg}" id="fileset.class.test">
<include name="*.class"/>
</fileset>


呼び出し方

<copy todir="//${.sv}/test/classes/${class.pkg}" >
<fileset refid="fileset.class.test"/>
</copy>


2箇所にクラスを配備したりするときにメンドクサイと思ってたら、こんな方法があるとは。
最初から調べとけばよかったなぁ・・・

junitを使ったテスト


プログラム組み終わった後のテストが大好き!って人はどれくらいおるんやろ・・・
間違ったプログラムを組もうとして組む人はおらんやろうけん、そのあら捜しをする行為を楽しめるとはなかなか思えない。まあ、そんなこというと開発者失格ですが。

でも楽したいところは楽したいのがプログラマ。
でも精度は維持したい。というわけで、いまさらながらJUnitを使ってみる。
事情があってJDK1.4_6しか使えないので、一昔前のバージョンについて書いてみる。
どのバージョンでも基本的な概念は変わらないし。
(書き方とかは結構変わるけど・・・)

junit関連の記事って結構前に流行ったみたいでそれなりにあるけど、具体的な応用例が少ない。
というわけで、色々使えるシーンを考えてみる・・・前に、junitの基本的な使い方をおさらい。
※eclipseを使うのが一番いい(というかそれ以外の使い方するならテストプログラムを自分で組んだほうが早い)のでeclipseで使った場合の手順をまとめ


1.eclipseでテストしたいソースを右クリックして[新規]-[junitテストケース]を選択してテストケースを作成。
2.するとテスト用プロジェクトにTestCaseクラスを継承したテストクラスが作成される。
 test{クラス名}というメソッドも自動で作成される。
3.このクラスをjunitテストとして実行すると、test{クラス名}メソッドの処理が実行される。
4.assertクラスなどのメソッドを使ってテストを行うと、junitパースペクティブに処理結果が表示される。


assertクラスはstaticなクラスで、予想値と実際に返って来た値を引数として渡すと比較して処理結果を返してくれるメソッドが用意されている。比較するのはいろんな型が用意されているので何でも対応可能。
これをテストパターンの数だけ呼び出すが、エラーがなければ処理が続き、エラーが0件であれば正常終了となる。
エラーがあった場合、その結果をjunit用のエラーを返し予想値と実際値を比較が表示される。
実行中は進捗バーが表示され、正常終了は緑色、異常終了は茶色になる。
※どちらの場合も自動でjunitパースペクティブが開かれる。

JFormattedTextFieldのcommitEdit()

JTextFieldは、フォーカスイベントに書式変換処理を書かなくても、フィールドの入力値を確定したタイミングで指定したフォーマットに変換する機能がある。

その際に利用するのが、JFormattedTextFieldでこれをカスタマイズしてJTextFieldに登録すると対象のテキストフィールドからフォーカスが離れた時に、フォーマット変換処理が走る。
この詳しいやり方はかかないけど、このJFormattedTextFieldのcommitEdit()というメソッドについて気づいたことをまとめる。

javadocによると以下の通り

【commitEdit】
public void commitEdit()
throws ParseException
現在の値を AbstractFormatter から強制的に取得し、現在の値として設定します。AbstractFormatter が現在インストールされていない場合は何も実行しません。
例外:
ParseException - AbstractFormatter が現在の値をフォーマットできない場合


実は、すでにフォーマット処理が完了しテキストフィールドにト変換後の文字列が入っている場合にこのcommitEdit()を実行すると、その変換後の文字列に対して再度フォーマット処理を行ってしまう・・・(汗)

日付をあらわす数値(20080405など)を入れると、自動的に年度や年月、西暦、和暦などのフォーマットに変換してくれるテキストフィールドの年月変換処理部分の変換ミスを調査した
※和暦を入れると数値に変換しなおして返してくれる。
途中の変換はうまくいってるはずなのに、最終結果が意図通りに表示されない。
よくよく追って見ると、setText()の後に、commitEdit()処理が呼ばれている。

いったい何が起こっているのかというと・・・

1.setText()のタイミングで数値(19890107)⇒和暦年(昭和63年)となる。
2.commitEdit()のタイミングで、平成20年⇒数値(19890601)※月は分からないので実行日の月が設定される。
3.再度フォーマットが走り、数値(19890601)⇒和暦年(平成元年)


大雑把にいうとこんな感じの処理が走って意味の分からない変換が起こったように見える。

ちなみに、commitEdit()をコメントアウトしてみると、1.のフォーマットのみが行われてこちらの意図通りの動きとなり、他の動作にも特に影響はない(たぶん)。
念のため呼び出しておいたんやろうと思うけど、こんな恐ろしい結果につながるとはね・・・(;ω;)

とりあえず、普通の使い方していればcommitEdit()自体はわざわざ呼び出さなくても良いのかな。(勝手にコミットされてる?)
おぼえとこ。