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

[osx]スポットライト 2006/04/23
2006/11/26

osxで開発していてスポットライトで検索できないと思っていたのは、スポットライトが対応しているテキストエンコーディング





http://8-p.info/Spotlight/

[java-idea]ぼんやり考えてみた 2006/04/22
2006/11/26

<枕>

アクセスしたいオブジェクトにアクセスするときいつもこまる。これはGUIもつアプリケーションを作成しているときにおこる。

</枕>



例えばManagerオブジェクトがあってその下にいろいろオブジェクトがある。

実装しているクラスにアクセサが用意されていると想定して、

manager.getA().getB().getC();

のようなコード書いてCというクラスにアクセスしたりしている。



で、それならば、リフレクションとか、オブジェクトの保持の仕方とかを規約化して、

C c = (C)serarchById("a.b.c");

とかでアクセスしてもよいと思う。



さて、問題はこのオブジェクトを検索してくれるメソッドをどこにおくのかという問題と、このメソッドはどこから指定のIdをもつオブジェクトを探してくるのかという問題がある。

これがDIコンテナが解決している。

ただしDIコンテナに定義されていないオブジェクトがある





話し変わって、グラフ構造、オブジェクトをキーワードにして、ぐーぐるさんにたずねたら、

http://www.atmarkit.co.jp/fjava/devs/roundtable01/roundtable01.html

Relaxerっていいせんいっていると思うんだけどなぁ

もっといろいろ活用事例があればいいのに。

[java-swing]KeyEventではまりそう 2006/04/21
2006/11/26

KeyEvent.VK_PLUSが必ずしも+ではないことに注意



http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4262044





ctrl + +で拡大処理をさせようとしてはまった。バグではない。





参考出力はサンのサンプルコードを利用

テンキーの+

KEY PRESSED:

key code = 107 (NumPad +)

modifiers = 0 (no modifiers)

action key? NO

key location: numpad



KeyCodeが107で、Javadocを調べるとVK_ADD



テンキーの-

KEY PRESSED:

key code = 109 (NumPad -)

modifiers = 0 (no modifiers)

action key? NO

key location: numpad

KeyCodeが107で、Javadocを調べるとVK_SUBTRACT



テンキーでないところはの+は日本語キーボードだとセミコロンの位置にある

KEY PRESSED:

key code = 59 (Semicolon)

modifiers = 0 (no modifiers)

action key? NO

key location: standard

KeyCodeが59で、Javadocを調べるとVK_SEMICOLON



テンキーでないところはの-は日本語キーボードだと

KEY PRESSED:

key code = 45 (Minus)

modifiers = 0 (no modifiers)

action key? NO

key location: standard

KeyCodeが45で、Javadocを調べるとVK_MINUS

[java-Rhino]いろいろあるなぁ 2006/04/21
2006/11/26

<枕>

はずかしながら、昔、プログラム言語は一部のベンダーだけのものだと信じきっていた時期がありました。例えば、マイクロソフトがサポートしているからとか、アップルが採用したから大丈夫とか。

でも、そんなことなくて、オープンソースの中からすごいものがでてきたりしとかしたり、個人のプログラマや、グループがすごいものをどしどしつくったり、それがスタンダードになったりとか。



いろいろなことを勉強しつつ、どんどんつくっていきたい今日このごろです。

</枕>



http://www.mozilla-japan.org/rhino/

[java-junit]いまさらながらJUnit 2006/04/20
2006/11/26

<枕>

現在(20060420)の職場では壊滅的にJUnitを使用している人はいない(1人僕あわせて二人) 。

僕も実はあんまり使用していない。使用したほうが絶対いいし、楽しい。

けど使っていない。。。。

</枕>



いまさらながら、assertの引数は、

一番目の引数が期待値(expected)

二番目の引数が実際の値(actual)



両方の順番がごっちゃになるので、何かごろあわせでおぼえたい。

[java-hsqldb]standaloneでデータが追加されていない 2006/04/18
2006/11/26

hibernateを勉強だと思ったやさき、HSQLDBではまった。



自分で書いたテストプログラムでためしていたところ、プログラムが起動している間はデータにアクセスできるが、プログラムを終了させて、HSQLDBのファイルにSQLが追加されていないことにきがついた。

あとロックファイルが消えない。コネクションのクローズだけではだめなのかしらと思いつつ。コミットすればいいのかなぁとか思いつつ、グーグルさんにお尋ねしてコネクション時に使う、URLに下記の文字列を追加すればよいことがわかった。



;shutdown=true



結構はまった。



参考URL:http://www50.tok2.com/home/oppama/hsqldb-start.html

[java-hibernate]お勉強中 2006/04/13
2006/11/26

[2006-04-18]hsqldb + Hibernateの組み合わせで勉強中 schemaexport
どうしてDBにエクスポートされないか悩んでいたら

 schemaexportのtextがyesだった。

noしないといけなかった。

http://www.hibernate.org/hib_docs/reference/ja/html/toolsetguide.html


[start]
hibernateをさわりはじめている。
前に買った本をとりだしてみたが、hibernateのバージョンが2を対象にした本だった。

いろいろ設定ファイルが変更になっていた。

build.xmlの書き方で悩んで下記のリンク
http://d.hatena.ne.jp/open-heart/20050629/1120013912
役にちました。

[java-osx-eclipse]mac用のeclipse 2006/04/08
2006/11/26

mac用のeclipse



http://alblue.blogspot.com/2006/04/eclipsemac-maclipse-and-maclipse-lite.html



<使用感想>

ダウンロードして使用してみた。僕は、プラグインの管理をlinksフォルダを使用しているので、.appの中にlnコマンドでリンク使ってlinksフォルダに使用するプラグインのlinkファイルをおいた。

結局、app版じゃないものをダウンロードして使っている。

</使用感想>

[java-jdbc]テーブルのメタデータの取得 2006/04/06
2006/11/26

30分以上はまった。

自力で解決しようとして、try and errorして、グーグルさんにうかがって下記のリンクにたどりついた。

こういったノウハウをすぐにだせる企業とか、グループとか、いいなぁ

投稿の詳細: JDBCのDatabaseMetaDataを使用したとき、テーブル情報が取得できません。



例えばテーブル名がmytableだったらアウト。

なので、下記のようにtoUpperCaseをしてあげるとうまくいく。



DatabaseMetaData metaData = connection.getMetaData();

ResultSet resultSet = metaData.getColumns(null, null, tableName.toUpperCase(), null);

[java]ハウスキーピング 2006/04/06
2006/11/26

[初期化]オブジェクト初期化の流れ 2006/04/05
2006/11/26

オブジェクトの初期化ではまってしまった。



あるオブジェクト(仮にAオブジェクト)が保持しているとメンバのオブジェクト(仮にCオブジェクト)を使用するとjava.lang.NullPointerExceptionが発生してしまう。



CオブジェクトはAオブジェクトのコンストラクタから初期化されるシーケンスになっていた。

ただしAオブジェクトのコンストラクタで直接CをNewしていない。



テストコード記載します。



public class A extends SuperA {



At at = new At();

C c = null;

At at2 = new At();



//コンストラクタを定義されていないので、

//SuperAのデフォルトコンストラクタが呼ばれる。



public void print(){

System.out.println("I am " + getClass().getName());

}



@Override

public void initialize() {

//このメソッドがSuperAのデフォルトコンストラクタから呼ばれる。

c= new C();

}



class At{

public At(){

System.out.println("=== At ===");

}

}

}





/**

*

* 抽象クラス

*

*/

public abstract class SuperA {



/**

* 初期化メソッドを呼び出します。

*/

public SuperA() {

initialize();

}



/**

* 初期化メソッド。 使用者は実装しないといけない。

*

*/

public abstract void initialize();



}



public class C {



public void print(){

System.out.println(">>> OK!!");

}

}



//テスト実行クラス

public class Main {



public static void main(String[] args) {

// 暗黙にデフォルトコンストラクタを呼び出す

A a = new A();

a.c.print();

a.print();

}



}



上記のプログラムは抽象クラスSuperAにはinitializeメソッドが用意されており、抽象クラスSuperAを継承するクラスはinitializeメソッドを実装しないといけません。

initializeメソッドの使用方法を意識しないようにするために、SuperAのデフォルトコンストラクタではinitializeメソッドを呼び出し、ています。



設計としてデザインパターンのテンプレートメソッドパターンを意識したつくりになっていると思います。



この方法が成功するためには、上記のコードの赤文字部分に意図的にnullを入れている部分を止めればうまくいきます。

C c;

にすれば、うまくいきます。



これは、コンストラクタされるシーケンスに注意しないといけない設計になっています。

初期化順序は、



(1)Aのデフォルトコンストラクタが呼ばれる。

(2)SuperAのコンストラクタが呼ばれる。

(3)SuperAからAのinitializeが呼ばれる。フィールド変数cが初期化される。

(4)Aクラスのスコープの初期化(フィールドの)がはじまる。この時に明示的にフィールド変数の初期化を行っていた場合(例えば、オブジェクトにnullを入れる等)、(3)で代入されたオブジェクトが上書きされる。



javaの初期化手順を知っていれば、フィールド変数で定義されたオブジェクトには、暗黙にnullが割り当ててあることをわかるが、フィールド変数にnullを入れてクラスを定義してしまうコーディングをする人は多い。



以上のことから設計の留意点なのだが、

(A)実装者がまちがをおかしずらい設計にする

(B)フィールド変数にはnullを入れて宣言しないコーディング規約を守る、もしくは制定して施行する。



いろいろ反省m(_ _)m