プログラマメモ2 - programmer no memo2

[java][eclipse][netbeans]eclipseで実行してnetbeanでプロファイラを動かしてみる 2006/09/26
2006/11/26

eclipseは好きな統合開発環境のひとつです。他のIDEを使用してみて、明らかに後れをとっていて残念だなと思う分野がGUI(Swing)のRADな環境とプロファイラの分野です。もちろんeclipse.org以外のプラグインを使用すればよいのでしょうが、netbeansがそれらも統合してリリースしているのをみるとやはりベースの開発道具は一式まとまっていたほうがうれしいと思います。



現在、ダウンロード購入できるプロファイラのJProfilerは真剣に購入すべきかどうか考えています。パーソナルユーズでも199ドルはします。先日XMLエディタのoxygenをダウンロード購入したばかりなので、二の足を踏んでいます。ちなみにXMLエディタのoxygenは、RleaxNGスキーマの編集、XMLからXPathを抽出するのに便利です。JProfilerはosxで使用できるということを確認したら購入するかもしれません。まだOSXではnetbeansのプロファイラは動かないようです。



<メモ>

eclipseで実行させてnetbeansでプロファイルをとるためのポイントのメモです。

シナリオ:


下記の環境で、eclipseで実行させているアプリケーションにnetbeansのプロファイラで接続させる。

windowsXP

eclipse3.3M1、netbeans5.0です。

Javaバージョンは1.4です。

アタッチの方法は、リモートで手動接続です。





ポイント1

システム環境変数で、netbeansのリモートのネイティブライブラリパスを設定しておく。

※eclipseで設定する方法がよくわからなかったので。あまり開発用件でシステム環境変数を書き換えたくないが、この場合は妥協しました。



ポイント2

eclipseのRuntime JREの設定で、netbenasのjfluid-jdk(profiler-server-50-windows-142\jfluid-jdk)を認識させておく。







ポイント3

java executable alternate設定をする。

../../bin/profile.bat









あとは、通常通りにeclipseで実行して、netbeansから接続すると、アプリケーションの実行、プロファイリングが開始されます。



とりあえず、足早なメモです。

</メモ>

[java]例外迷子 2006/09/23
2006/11/26

アプリケーションが複雑になるにつれて、バグがでた場所を発見するのが難しくなります。

アプリケーション内部で問題が発生した場合に、まずログ出力を調べるのが通常の対応でしょう。





javaの例外を出力に慣れておくために、サンプルコードで出力されるエラーをみてみます。



例外出力



MyRuntimeExcptions$ARuntimeExcption: MyRuntimeExcptions$BRuntimeExcption: MyRuntimeExcptions$CRuntimeExcption: java.io.FileNotFoundException: @_@!! (No such file or directory)

at TestRuntimeExcption.wrappingExcptionA(TestRuntimeExcption.java:21)

at TestRuntimeExcption.main(TestRuntimeExcption.java:10)

Caused by: MyRuntimeExcptions$BRuntimeExcption: MyRuntimeExcptions$CRuntimeExcption: java.io.FileNotFoundException: @_@!! (No such file or directory)

at TestRuntimeExcption.wrappingExcptionB(TestRuntimeExcption.java:29)

at TestRuntimeExcption.wrappingExcptionA(TestRuntimeExcption.java:19)

... 1 more

Caused by: MyRuntimeExcptions$CRuntimeExcption: java.io.FileNotFoundException: @_@!! (No such file or directory)

at TestRuntimeExcption.wrappingExcptionC(TestRuntimeExcption.java:38)

at TestRuntimeExcption.wrappingExcptionB(TestRuntimeExcption.java:27)

... 2 more

Caused by: java.io.FileNotFoundException: @_@!! (No such file or directory)

at java.io.FileInputStream.open(Native Method)

at java.io.FileInputStream.(FileInputStream.java:106)

at java.io.FileInputStream.(FileInputStream.java:66)

at TestRuntimeExcption.causeFileNotFoundExcption(TestRuntimeExcption.java:77)

at TestRuntimeExcption.causeExcption(TestRuntimeExcption.java:72)

at TestRuntimeExcption.test7(TestRuntimeExcption.java:68)

at TestRuntimeExcption.test6(TestRuntimeExcption.java:64)

at TestRuntimeExcption.test5(TestRuntimeExcption.java:60)

at TestRuntimeExcption.test4(TestRuntimeExcption.java:56)

at TestRuntimeExcption.test3(TestRuntimeExcption.java:52)

at TestRuntimeExcption.test2(TestRuntimeExcption.java:48)

at TestRuntimeExcption.test1(TestRuntimeExcption.java:44)

at TestRuntimeExcption.wrappingExcptionC(TestRuntimeExcption.java:36)

... 3 more





caused byと出力されているところが、例外を発生させた場所ですね。







使用したソースコードです。



import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;



public class TestRuntimeExcption {



public static void main(String[] args) {



try {

wrappingExcptionA();

} catch (Exception e) {

e.printStackTrace();

}



}



public static void wrappingExcptionA() {

try {

wrappingExcptionB();

} catch (Exception e) {

throw new MyRuntimeExcptions.ARuntimeExcption(e);

}

}



public static void wrappingExcptionB() {

try {

wrappingExcptionC();

} catch (Exception e) {

throw new MyRuntimeExcptions.BRuntimeExcption(e);

}

}



public static void wrappingExcptionC() {



try {

test1();

} catch (Exception e) {

throw new MyRuntimeExcptions.CRuntimeExcption(e);

}



}



public static void test1() throws Exception {

test2();

}



public static void test2() throws Exception {

test3();

}



public static void test3() throws Exception {

test4();

}



public static void test4() throws Exception {

test5();

}



public static void test5() throws Exception {

test6();

}



public static void test6() throws Exception {

test7();

}



public static void test7() throws Exception {

causeExcption();

}



public static void causeExcption() throws Exception {

causeFileNotFoundExcption();

}



public static void causeFileNotFoundExcption()

throws FileNotFoundException, IOException {

new FileInputStream("@_@!!").close();

}



public static String causeNullPointerException() {

String s = null;

return s.toString();

}



}









public class MyRuntimeExcptions {



public static class ARuntimeExcption extends RuntimeException {



/**

*

*/

private static final long serialVersionUID = 1L;



public ARuntimeExcption() {

super();

}



public ARuntimeExcption(String message, Throwable cause) {

super(message, cause);

}



public ARuntimeExcption(String message) {

super(message);

}



public ARuntimeExcption(Throwable cause) {

super(cause);

}

}



public static class BRuntimeExcption extends RuntimeException {



/**

*

*/

private static final long serialVersionUID = 1L;



public BRuntimeExcption() {

super();

}



public BRuntimeExcption(String message, Throwable cause) {

super(message, cause);

}



public BRuntimeExcption(String message) {

super(message);

}



public BRuntimeExcption(Throwable cause) {

super(cause);

}



}



public static class CRuntimeExcption extends RuntimeException {



/**

*

*/

private static final long serialVersionUID = 1L;



public CRuntimeExcption() {

super();

}



public CRuntimeExcption(String message, Throwable cause) {

super(message, cause);

}



public CRuntimeExcption(String message) {

super(message);

}



public CRuntimeExcption(Throwable cause) {

super(cause);

}



}

}



クロージャがJDK7から導入されるらしい 2006/09/21
2006/11/26

クロージャがJDK7から本格的に導入されるようです。

James Gosling: on the Java Road



これを機会にLisp、Smalltalk、Ruby、C#のクロージャについて調べてみたいなと思います。

製品として考えるならクリアしなければいけない問題  2006/09/21
2006/11/26

[Java][雑感]eclipseからnetbeansへ 2006/09/21
2006/11/26

Eclipseを使用していると、IDEに助けてもらっているなぁとしばしば思います。他のIDEでもしばらく使いこなせばそう感じると思うので、別に格段にEclipseが飛びぬけているとは主張しません。



おぼろげに、感じていたことがはてなの日記で書いてありました。

きしだのはてな EJB3(JPA)はコーディングレス開発への足がかり



NetBeans以外にはeclipseベースのJBuilderとか期待してます。



ビジネスアプリケーションの開発に重点をおくならば、いかにコードレスかというのは重要な点です。



そうだとは思いたくないですが、コードレス、生産性を追及するなら、やはりマイクロソフト製品群で固めるのがよいのでしょうか。個人的にはMacユーザーなので、Macで動作が可能なJavaを選択しますが。



.netに興味があるのは、xboxのゲームの開発環境がオープンだという話を聞いたのでその面に関しては.netもいいかなと思ってます。



コードレスな方向としては、あとMDA(Model Doriven Architecture)がありますね。モデルから、コードを自動生成云々。



いずれにしろ、×××陣営、×××派閥、とならないようにしたいものです。ですが、個人的には自由に開発して多くのプラットフォームでGUIアプリケーションを発表できる可能性があるJavaが現在のところメイン開発環境です。



こういうことを聞いたことがあります。「コードを書かなければバグらない」と。さらにいうと「コードを書かないと動かない」ともいえるかなと思います。



いずれのプラットフォーム、開発言語、開発環境、にしろ楽しくプログラムしたいところですね。

[.net][windows]Microsoft® Expression® Graphic Designer 2006/09/15
2006/11/26

これからのデスクトップアプリケーションは、見た目がリッチな方向に進んでいます。これはAppleMac OSXをみていてもあきらかです。OSからして、リッチならその上で動作するアプリケーションもリッチなものが要求されます。



Web2.0をデザイン面から語るとき、グラデーション、ピカピカアイコン等などがあります。Web2.0ではあたりまえといわれているものが、デスクトップアプリケーションにもっと進出してくるでしょう。

ウェブデザインのトレンド:死の宣告



操作性はもちろんですが、視覚表現も重要なアプリケーションを一要素として要求されています。



Webの開発で、MVCデザインパターン、テンプレートが重要視された理由のひとつに、デザイナーとプログラマとの架け橋がありました。この問題はデスクトップアプリケーション開発においても、どうするかこれからさらに頭が痛い問題です。開発ツールの部品をただ並べたアプリケーションにはもう満足できないからです。



フリーのベクターベースのグラフィックツールで実用的なものの噂を聞いたことがありませんでした。

ピクセルベースのアプリケーション、例えばアドビのフォットショップの代替アプリケーションとしては、Gimpなどがメジャーだと思います。気軽でデザインできる環境は、デザイナーだけでなく、プログラマが簡単なモックアップを作成するのにも役にたちます。





かっこいいアプリケーションを作成するための垣根をマイクロソフトのツールが下げてくれそうです。

Microsoft® Expression® Graphic Designer

第1回:エンジニアとデザイナの架け橋となるMicrosoft Expression(デザイナ視点)

第2回:エンジニアとデザイナの架け橋となるMicrosoft Expression(エンジニア視点)



かっこいいアプリケーションを開発したいプラグラマはもっとデザインツールに挑戦したほうがよいかもしれませんね。

[java][IDE][NetBeans]NetBeansのソースタブが好き 2006/09/14
2006/11/26

現在、javaの開発においてIDE(統合開発環境)はほとんどのデベロッパーが使用していると思います。

IDEは便利ですが、やはりある程度使用方法を学習が必要です。



アプリケーションのマニュアルにほとんど目を通さない昨今において、動画、アニメーションをもちいてのレクチャーはお手軽で効果的な方法です。



ユーザ啓発にFlashを利用してアプリケーションの動作をデモしているサイトをよくみます。



あとアプリケーションのバグ発現を動画にキャプチャするというのも効果的ですね。いくら口で説明しても共通認識を得ることができないUI周りのプログラマさんとのやりとりに有効でしょう。



現在、YouTubeの様な巨大な動画アップロードサイトを使うのも手かもしれません。



ところで、

eclipseは機能としては申し分ないのですが、不覚にもNetBeans5.5のUIをみていてとかっこいいなと思いました。

下記はNetBeansのタブです。







社内教育、ノウハウ伝授に動画を使用していきたいところです。

百聞は一見に如かずですからね。

[java]JNLPで必要なライブラリ 2006/09/14
2006/11/26

開発で必要なライブラリは安定稼動すると早々変更しないものです。



ライブラリのバージョンをあげようとすると、新しいバージョンが問題がないか検証しないといけないから、だめだということにしばしばなります。これは通常の反応です。



ところで、Java Web Startで使用される開発者ライブラリはJDK1.4以前は、JDKとは別にダウンロードする必要がありました。JDK1.4以降はJDKに含まれています。

以前は、jnlp.jarにjavax.jnlp.*がありましたが現在は、JDK1.4にはJAVA_HOME/jre/javaws/javaws.jarにあります。検証はwindows版のj2sdk1.4.2_12です。

JDK5の場合また微妙にディレクトリが違うようなので注意が必要です。



使用しているライブラリが多くなると、バージョンに注意しないといけないので大変ですね。

[opensource][google]googleでオープンソースプロジェクトのホスティングサービスが開始されていました。 2006/09/08
2006/11/26

googleでオープンソースプロジェクトのホスティングサービスが開始されていました。



http://code.google.com/hosting/



Subversionを使用してソース管理を行うことができます。



試しにquicklunchというプロジェクトをつくってみました。





手軽にオープンソースプロジェクトできるのはうれしいですね。

[java][eclipse][netbeans]VEがんばれ。 2006/09/07
2006/11/26

eclipseを好んで使用しています。eclipseはいいIDEだと思います。

ただし、不満があります。GUIをもつアプリケーションを開発する際に、決め手になるプラグインがないように思えます。VE(VisualEditor)がでてくるまえは、ボーランドのJBuilderでUIを作成して、メインの開発はeclipse上で行っていました。



VEが登場してからは、eclipseオンリーで開発を行っています。しかしプライベートでの開発はMac OSXで行っているのですが、OSX上でのVEは現時点では実用レベルではないと思います。



NetBeans5.5Beta2のWindows版をためしてみています。GUIを作成する部分は、さくさく動くようです。OSXで動作するNetBeansでGUI作成する部分がさくさく動くようでしたら、GUIは、NetBeansで開発し、ロジックはeclipseで開発をすすめようかと思います。



NetBeansのGUIを作成する部分にたいしての不満は、やはりデザイン用の設定ファイルが残ることです。VE場合は、ソースのみで行っているようです(仮にあったとしてもワークスペースにはみえないです)。



VEの設計思想はいいと思います。VEがつくるコードは、一番クセがないうえに、作業環境をデザイン用のファイルで汚さないです。



VEにがんばっていただきたいです。

[java][log4j]設定ファイルの上書き読み込み 2006/09/05
2008/01/20

アプリケーションログを出力するのにcommons-loggingとlog4jをよく使用しています。



log4jを使用していて、

設定ファイルにアプリケーションログの出力パスを決めうちで書いていると動作環境が違う場合に対応しないといけい場合が発生します。



下記のように対応しています。



(1)デフォルトのlog4j.xmlファイルを用意します。

(2)log4j.override.xmlファイルを用意します。

動的に変更したい設定は${環境変数}を利用して記述しておきます。

(3)まず、アプリケーションのスタートアップで環境変数を準備して、

Log4jUtilsクラスで設定ファイルを上書き読み込み(log4j.override.xmlの読み込み)します。



デフォルトのlog4j.xmlの例

標準出力を行います。



<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>

<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender" >

<param name="threshold" value="debug"/>

<layout class="org.apache.log4j.PatternLayout">

<param name="ConversionPattern"

value="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>

</layout>

</appender>

<root>

<priority value="debug" />

<appender-ref ref="STDOUT" />

</root>

</log4j:configuration>





デフォルトのlog4j設定上書きするlog4j.override.xmlファイル例です。

ログをファイルに出力します。



<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">



<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>

<!--

you must set env parameter ${service.home}.

ex. System.setProperty("your.log.filepath", FILE_PATH);

-->

<appender name="OPERATING_LOG_APPENDER"

class="org.apache.log4j.RollingFileAppender">

<param name="File" value="${your.log.filepath}"/>

<param name="Append" value="true"/>

<param name="MaxFileSize" value="10MB"/>

<param name="MaxBackupIndex" value="10"/>

<layout class="org.apache.log4j.PatternLayout">

<param name="ConversionPattern"

value="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>

</layout>

</appender>



<root>

<appender-ref ref="OPERATING_LOG_APPENDER"/>

</root>

</log4j:configuration>





Log4jUtilsユーティリティクラスの例です。





import org.apache.log4j.LogManager;

import org.apache.log4j.xml.DOMConfigurator;



public abstract class Log4jUtils {



static final String OVERRIDE_LOG4J_XML = "log4j.override.xml";



public static void initializeLog4jxml() {

initializeLog4jxml(OVERRIDE_LOG4J_XML);

}

public static void initializeLog4jxml(String log4jxml) {

new DOMConfigurator().doConfigure(Thread.currentThread().getContextClassLoader()

.getResource(log4jxml), LogManager.getLoggerRepository());



}

}







log4jサイト http://logging.apache.org/



設定情報の上書きというテクニックはいろいろな状況で有効なのではないでしょうか。

[いろいろ]いろいろ気になることがおおいですね。 2006/09/04
2006/11/26

あとでまとめる





http://java.sun.com/products/jfc/tsc/sightings/S23.html



http://jakarta.apache.org/commons/scxml/



http://www.jfugue.org/index.jsp



http://weblogs.java.net/blog/joshy/



http://www-128.ibm.com/developerworks/autonomic/books/fpy0mst.htm#HDRAPPA



http://www-06.ibm.com/jp/developerworks/autonomic/040917/j_ac-cbe1.html