[最新記事] [過去ログ]

8/10(Fri)

/** 目指せ! Sun Certified Developer for the Java2 Platform!! */ 進捗把握な日。 っていうか、特に何もしてません(^^; 画面(Swing): 80%は完了? データベース: 検索&更新はOK。ロックを実装していないので、まだ50%ぐらい? ネットワーク: 未着手。 ドキュメンテーション: ほとんど未着手。(→ほんとにイケない傾向だねぇ...) つーわけで、3ヶ月経過時点にしては、思わしくないような気がします。 まあ、ここ一ヶ月で、ほとんどゼロの状態から、ここまで持ってきただけでも、 「よくやった!」つー感じですが(^^; ちなみにネットワーク部分の実装に関しては、 データベースの機能をラッピングしてやるだけなので、 これは、RMIを使えば早いと見込んでます。 生Socketなんて、だるだるでやってらんないでしょ(^^; やっぱ、問題になるのはドキュメンテーションですかねぇ。 まあ、大した規模のアプリケーションじゃないので、 そんなに膨大になるとも思えないんだけど... /** 目指せ! Oracle Master Platinum!! */ 仕事で、PL/SQL。 変数で指定された表の行数を取ろうと思ったけど、 これが意外と難しかったりして、ハマって、結局投げて帰ってきました(^^; なんか、操作系SQLの表名には変数使えないとかいう、妙な制限があるらしい。 (→違ってる可能性大(^^;) DBMS_SQLパッケージがアヤシイような気もするんだけど、 さぁっぱり使い方わかんないし(T_T) 帰り際、苦肉の策として、表を ANALYZE TABLE table_name COMPUTE STATISTICS して、user_tablesデータディクショナリから、num_rows列を取り出すってのを思いついたけど、 そこまでするぐらいなら、JDBCで組んだ方が早いねーって感じ(^^; なかなか実用レベルになると、にわかOracle Masterじゃ通用しないのです(>_<;

8/9(Thu)

/** 目指せ! Sun Certified Developer for the Java2 Platform!! */ ドキュメンテーションな一日。 javadocをパッケージ名で構築すると、 overview-summary.htmlが生成されて、 パッケージの説明が入るテーブルが表示されますが、 一体、ここに入れる内容って、どこに書くの? っていうのが、かなり疑問になりました。 というわけで、早速JavadocのマニュアルへGo! javadocは、ソース中のコメントから自動生成できる、html形式のクラス仕様書。 だと思っていましたが、それは若干違ってました。 なぜなら、「パッケージコメントファイル」と「概要コメントファイル」 というものが存在し、これらはhtmlファイルだからです。 結論から言うと、パッケージの説明文は、 このパッケージコメントファイルの、Bodyタグの直下に書いた文章が該当します。 っていうか、抜き出して埋め込んでるだけっぽいので、意外と原始的でした(^^; パッケージコメントファイルの置き場所は、 java.ioパッケージなら、 ${SRC.DIR}/java/io ディレクトリ(つまり、ソースファイルがあるところと同じ場所)に、 package.htmlというファイル名で入れます。 ちなみにですが、Java2に付属しているsrc.jarには、package.htmlは含まれていないようです。 参考になると思ったんだけどな... というわけで、これからjavadocを使うときは、 ドキュメンテーションコメントだけじゃなくて、 package.htmlも用意しましょう!

8/8(Wed)

/** 目指せ! Sun Certified Developer for the Java2 Platform!! */ javax.swing.DefaultComboBoxModelのサブクラスで、 中身がほとんど一緒な二つのクラスをリファクタリングしました。 Modelの構築プロセスで、二箇所だけ違っていたので、 そこに「メソッドの抽出」のリファクタリングを適用。
「メソッドの抽出」リファクタリング適用前
クラスAクラスB
public class A
{
	public void modelBuildingProcess()
	{
		初期処理;
		クラスAに固有なデータ取得処理;
		終了処理;
	}
}
public class B
{
	public void modelBuildingProcess()
	{
		初期処理;
		クラスBに固有なデータ取得処理;
		終了処理;
	}
}

「メソッドの抽出」リファクタリング適用後
クラスAクラスB
public class A
{
	public void modelBuildingProcess()
	{
		初期処理;
		getData();
		終了処理;
	}

	public Object getData()
	{
		クラスAに固有なデータ取得処理;
	}
}
public class B
{
	public void modelBuildingProcess()
	{
		初期処理;
		getData();
		終了処理;

	public Object getData()
	{
		クラスBに固有なデータ取得処理;
	}
}


これで、構築プロセスメソッドの中身は一緒になったので、
こいつをTemplate Method(Template Methodパターン[GoF])として、スーパークラスに引き上げ。
(これも、何とかっていうリファクタリングだった気がする。)
「メソッドのスーパークラスへの引き上げ?」リファクタリング適用後
ParentClassクラスAクラスB
public abstract class ParentClass
{
	public final void modelBuildingProcess()
	{
		初期処理;
		getData();
		終了処理;
	}

	protected abstract Object getData();
}
public class A extends ParentClass
{
	protected Object getData()
	{
		クラスAに固有なデータ取得処理;
	}
}
public class B extends ParentClass
{
	protected Object getData()
	{
		クラスBに固有なデータ取得処理;
	}
}

こうして、重複コードは排除され、保守性が向上しましたとさ(^^)v

8/7(Tue)

/** Win32でtelnetサーバ計画 */ 今日は、激不調(>_<; めちゃくちゃ遅くなったり、つながるんだけど、プロンプトが出なかったり。 inetdを再立ち上げして、問題が解決したり、しなかったり。 NTをログオフして問題が解決したり、しなかったり。 も〜わけわからんっ(>_<; やっぱ、サーバにWindowsなんてダサダサなのさ... /** どっぷりAnt */ 今日一日は、比較的ヒマだったので、Antのお勉強。 今まで手作業でやってた部分を、Antに組み込んでみたり。 でも、INTERSTAGEのejb起動コマンドが、応答返ってこなかったりして、 コンプリートせず(>_<; コマンド単体だと動くので、Antのせいだとは思うんだけどね... 調査中... antcallという、Built-In Taskを使えば、 targetから、別のtargetを呼べることが分かりました。 で、やっぱ共通targetライブラリみたいなのを作りたいね。と思ったものの、 マニュアルみても、はまり道(-_-; で、帰ってWebで調べてみたら、 <antcall target="makefileclean"> <param name="dir" value="SharedApi"/> </antcall> みたいにするらしい。 早速明日試してみるべし! このテクニックは、多分かなり使えるよ〜。 /** 目指せ! Sun Certified Developer for the Java2 Platform!! */ 既に、3ヶ月経過。まだまだ大丈夫(なはず。) 今日は、重複コード排除作業。 安直に作っちゃったっぽい個所を見つけて、メモる作業。 結構、「それでいいの?」的なところが見つかるので、 そういうところが、多分要リファクタリング個所なはず。 まだまだしばらくは、コードの見直し作業が続きそう...(-_-;

8/6(Mon)

/** Win32でtelnetサーバ計画 */ とりあえず会社でも無事動いたらしい。 やっぱ、いちいち席を移動しなくても、作業できるっつーのはかなり良い感じ。 ただ、vimとか、lsとか、基本的なコマンドですら、日本語通ってないのは、 本格的な作業環境としては、いまいちなんだけどね。 DOSで出来なかった、プロンプト(y/nみたいなヤツ)への自動入力なんかも、 シェルを使えば出来ちゃうし。 やっぱ、コマンドプロンプトなんて、ダサダサでしょ(^^; というわけで、cygwinをインストールして遊びましょう♪ /** 改めてAnt + JUnitの威力を実感 */ JSPで作られた画面を、"ほけー"と眺めているだけでは見つからなかったバグも、 「あんた、このテストケース期待値と違うよ!」 と、ずばり指摘してくれるし(^^) で、コーディングに戻ってみたら、ResultSet余計に進めてるし(^^; それで取得件数が1件減っていたのでした(^^;; とりあえずバグを取り除いて完了! 再テストしてみると、OKが出たのでした(^^)/ ちなみに、こうして当該クラスをテストしている間も、 別のクラスも一緒にテストされているので、 暗黙の内にデグってても、検出されるので安心です。 ていうか、これ使わなかったらオカシイでしょ(^^; /** 目指せ! Sun Certified Developer for the Java2 Platform!! */ Listenerの実装は迷うねー(>_<; 1) 無名クラスで実装する。 object.addXXXListener(new XXXListener(){ ... }); 2) 内部クラスで実装する。 class MyXXXListener implements XXXListener { ... } 3) 独立したクラスで実装する。 public class MyXXXListener implements XXXListener 今のところ、全部3)でやってるけど、それで良いのかはナゾ。 ちなみに、ボタンとかも別クラス作ったらいいのか、 それとも、ウインドウクラスのメンバとして定義すべきなのかも、 同じぐらい悩ましい問題だったりします。 こっちはとりあえず、メンバとして持ってるけど、これもナゾ。 要リファクタリングなコードになってるのだけは確実(-_-;

8/5(Sun)

/** Win32でtelnetサーバ計画 */ 現在、実験用サーバ機として使っている、NT4.0Serverのマシンがあるのですが、 こいつで作業をする場合、設置場所である島のはしっこまで歩いていかなければならない という難点があります。 UNIXなら、telnetでログインして、作業するところですよね。 で、ひょっとして、Windows用のtelnetサーバなんて、 タダであったりするんじゃないの? と思い、探してみることにしました。 が。 Vector等を探しても、まともなものが出てくる気配は一向になく、 出てきたのは、こんなのでした。 っていうか、お金払わないといけないんじゃ〜ん(T_T) ... つーわけで、今度はLinuxで動いているtelnetdが、 実はwin32対応しているということを願いつつ、探してみることに。 すると、どうやらcygwinがよさげということが発覚。 紆余曲折(下記トピック参照)の後、なんとかin.telnetdを、 inetd経由で動かすことに成功しました。 が、なんとなくおそ〜い(T_T) まあ、動けばいいかぁ... /** 紆余曲折 */ cygwinのインストールに関しては、 http://hm.aitai.ne.jp/~mtani/gnuwin_1.htm に詳しく書いてあったので、すんなり行きました。 が、問題はここから。 /usr/sbin/に、in.telnetdや、inetdが存在するのは分かったのですが、 いきなりパスが通っていない(>_<; さらには、/etc/inetd.confや、/etc/servicesが存在していない。 など、まさにデフォルト状態。 とりあえずWebを調べた結果、 /usr/sbin/inetd -d で起動するらしいことが分かったので、 inetd.confや、servicesを記述することに。 ここで、記述例を見ようと、pcg-c1sマシンにLinuxが入っていたことを思い出し、 起動しようとするも、なぜか電源が入らず。 「壊れた...壊れた...壊れた...がーん...がーん...がーん」 なんかもう、ショックすぎ(T_T) ところが、一日置いたら起動するようになってました(^^) なんかもう、ほっとしたねぇ。 で、とりあえずWebで調べたら、すぐ出てきたので、telnetサービスだけを記述し、 認証モード(?)で起動しなきゃならないらしいので、in.telnetd -aをし、 /etc/passwdを作って(そんなのも作るんかいっ!)、 なんとか起動することが出来ました。 やっぱLinuxって、至れり尽せりなんですねぇ。 と、同時に、Windowsをサーバにするのなんて、やっぱ無理って感じです(>_<; その筋の人から言わせれば、pcAnywhere使えって感じなんだろうけど...

8/4(Sat)

/** ついに... */ Mサイズのピザを、一人で平らげる作戦成功♪ 今回のターゲットは、「ゴールデントリプルコーンのカレーソース」 まじでうまかった...(^^) なんか、土曜の午後を満喫って感じでした(^^)/ /** Lモード */ http://www.zdnet.co.jp/news/0108/03/lmode.html なかなかに寒い状況らしい(^^; これって、ある意味「インターネット冷蔵庫」とか「インターネット電子レンジ」が、 「インターネット電話」になったようなもんだもんねぇ。 Lモードと最近の携帯電話って、機能がかぶってるから、 携帯持ってる若年層には、広がらないだろうねぇ。 そもそも、固定電話持ってない人もいるらしいし。 やっぱ、ターゲットが機械オンチのおばちゃんが相手じゃあねぇ。 でも、i-modeとかってやっぱ便利だから、 マーケティング次第では、広まるような気もするけど。どうなんでしょう? CMはやってるけど、イマイチっぽい? /** 投資家デビュー(^o^)/ */ 今月も、「取引報告書」&「月次報告書」が届いたみたい。 さすがに、株式をほとんど組み入れず、ほとんどが債権で運用しているせいか、 一月経っても、ほとんど基準価額の変動はなし。 まあ、RR(リスクリターン)の低い銘柄だから、こんなもんでしょう。 ところで、 「こんな銘柄も買ってみませんか?」 的なノリで入ってたパンフレット。 こいつを見ると、表にも裏にも、妙なガイジンの写真が載ってたりします。 よくよくみると、 「ファンドマネージャー (運用担当者)」 とかって書いてあります。 つまり、僕みたいな投資信託を買っている人に代わって、 あの株買ってとか、今は株が良くないから債券を組み入れとこうとか、 (絶対、そんなに単純じゃないですが。) 色々考える人で、当該ファンドに関しては、ある意味一番重要なファクターだったりします。 ちなみに、このガイジンの名前をGoogleでサーチしたら、452件もヒットしました。 よっぽど、有名なファンドマネージャーなんでしょう。 と、ここまでは良いのですが、パンフレットのすみっこに、こんなことも書いてあります。 「※運用担当者は変更になる場合があります。」 っておい〜(x_x; このファンドマネージャーありきのファンドなのに、 変わっちゃったらいみないじゃ〜ん(>_<; 相変わらず、日本のGray Zone的な要素を感じたのでした。

8/3(Fri)

/** 目指せ! Oracle Master Platinum!! */ ついに! ラストのNetworkにエントリー!! 勝負は、8/18(Sat)。 思えば、長い道のりだった... 気が付けば、このトピックすでに28回目だったりします。 考えても見れば、免許取るのとおんなじぐらいかかってるもんなぁ。 (→それもヤバいでしょ(^^;) 最近の良い傾向としては、仕事上Oracleで分からないことがあっても、 マニュアルを見て解決できるようになったっぽいこと。 まあ、最低限マニュアル読めるようになれば、 仕事で困ることは、そんなにないと思います。 ここまでくるのに、マスターが役に立っていることは言うまでもなく。 /** 目指せ! Sun Certified Developer for the Java2 Platform!! */ 今日は、例外処理などを導入。 ついでに、少しだけロックを考慮しない更新系も着手。 javax.swing.InputVerifierっていう、入力チェック用のクラスがあります。 こいつが使えるかと思って、過剰に期待していたのですが、期待はずれに終わりました(>_<; たとえば、2桁の数値しか入力できないInputVerifierを、 テキストフィールドに設定したとして、 期待としては、キーボードから「a」とか、「123」とかを入力しても、 受け付けない状態になるのかと思ってました。 ところが、実際には「abc」も入るし、「1234567」も入る上に、 処理ルーチンにそのまま渡ってしまうので、 下手すると、NumberFormatExceptionとか出てしまうのでした(>_<; 実は、このInputVerifierというクラス。 APIをちゃんと見てみれば、フォーカスの制御をするためのもの。 という風に書いてあります。 つまり、不正な入力値が入っている場合は、tabでフォーカスが制御しない。 といったチェックを行うことができるのです。 まあ、これはこれでそのままあってもいいかなぁと。 そんなわけで、結局数値チェックは入れるのでした(-_-; といっても、NumberFormatException受け取ったら、 「正しい値を入力して下さい」みたいなダイアログを出したりするだけだけどね。 やっぱ、GUIってめんどくさいわぁ(x_x; なんだかんだいって、まだまだ完成は先らしい... /** USBストレージ */ なんか、NW-MS9って、USBストレージとして使えるみたい(^^; ただ、データをやりとりするマシン間には、 「Memory Stick Driver」が必要になるけど。 一応、今僕が持っているメモリースティックは、 64MB(ドライブとして認識した場合の容量は、60.4MB)なので、 全然曲を入れないとすれば、それだけ入るっつーのは、 なかなかのツワモノかも知れません(^^; ちなみに、MAGIC GATE Memory Stickっていうのは、 128MBのやつもあったりするから、 すでに、昔のMO並の容量を備えてるってことを考えると、すごいのかも。 バッドだったのは、「Memory Stick Driver」を入れるのに、 「OpenMG Jukebox」を入れないと、インストールできなかった点。 今現在、仕事用のマシンに、なぜか音楽プレーヤーが入ってたりします(^^; まあ、Real Audioとか、どこでも入ってるしねぇ。 そんなわけで、思わぬところで拾いもの状態でした(^^)v

8/2(Thu)

/** 目指せ! Sun Certified Developer for the Java2 Platform!! */ ようやくこっちにも、ant導入しました。 これで、コンパイル → Javadoc生成 → Jarアーカイブ生成が、 「ant」 で出来るように(^^) パッケージ名を入れると、ディレクトリを考慮して、 javac dir1/dir2/honya.java とかいうことをやりがちで、結局めんどうだから、 javac *.java とかやってみたり(^^; antを使うと、その辺勝手にやってくれるし、 基本がmakeだから、ちゃんと修正があったやつだけコンパイルしてくれるし(^^)/ 依存関係がわけわかになっちゃったときも、 「ant clean」 定義しといて、実行すればオッケーだし。 ついでに、テストドライバの実行も 「ant run」 で出来るように。でも、 「java Main」 とさして変わらんなぁ(^^; /** IDEを使いたくなる瞬間 */ 某クラスが1KStepを越えたあたりから、 「あのメソッドどこにあったっけ?」 ということが多くなり、いちいち検索して探すよりも、 メソッド一覧をクリックした方が早いでしょ。 という結論に達しました。 う〜ん。 JBuilderは重いから、絶対使うまいと思ってたんだけどなぁ(>_<; とりあえず、AntRunner組み込んで、「F10」しまくりって感じですかねぇ。 /** 物欲たびたび */ この間掲示板で話題に上がってた、USBのストレージ欲しくなってきちゃった(^^; いくら客先だからって、Web使用禁止はヒドすぎるんですが、 だからと言って、全く使えるようになる雰囲気が無いので、 何か必要になるたびに、自宅で落としてFDで運ぶ日々。 なんかこれって違くない? まあ、百歩譲ってそれが仕方が無いことだったとしても、 FDってばきびしいね(>_<; 一応分割ツールとか使えば、3〜4MBぐらいまではなんとか運べるけど、 それにしたってめんどうだし。 とりあえず10MBもあれば十分なのになぁ。 /** そういえば */ この間買った、メモリースティックウオークマンNW-MS9。 こいつをUSBに挿すと、リムーバブルのドライブとして認識するのでした(^^; とりあえず、64MB容量あるし、実はこいつが使えるのかも。 普通のデータも、どうやら入るらしい。 でも、データ移動先に、ドライバが入れられるのかはナゾだねぇ。 なんせ、いつこないだライセンス問題で、OSごと再インストールしたばっかだし。

8/1(Wed)

/** 突入! */ ついに4年目になってしまわれました(^^; 社会人になってから、1年続いたってのが驚きだね。 まあ、それだけヒマヒマだったってことですが(T_T) /** 目指せ! Sun Certified Developer for the Java2 Platform!! */ ボタンを押すと、コンボボックスの値を取ってきて何か処理をするところ。 ボタンのActionListenerを内部クラスとして作れば、 MyWindow.thisを使って、ボタンが所属するウインドウを操作できるので、 コンボボックスの値を取得できます。 この方式でも、ボタンとコンボボックスの依存関係が、 ウインドウクラスに隠されるので、問題は無いよう思います。 ただ、このままだと内部クラスから抜け出せません。 そこで、当初から使おうと思ってた、Mediatorパターンを参照することに。 このパターンは、コンポーネント同士の依存関係を、 一つのクラスにまとめて、すっきりっていう感じです(^^; 今回の例で言えば、ボタンとコンボボックスの依存関係を、ウインドウにまとめてしまおうというわけです。 (多分、本読まないと分からない説明だな...) とりあえず、ボタンのActionListenerクラスのコンストラクタに、 Mediatorである、ウインドウの参照を渡しておしまい! これで、「MyWindow.this」などという、よー分からんコーディングをせずにすむのでした(^^)/ まー言っちゃえば簡単なのかも知れないけどね(^^; /** 目指せ! Oracle Master Platinum!! */ 僕の周りで、Oracle Masterを目指す人急増中(^^)/ みんなでガシガシOracleにボッタくられましょう♪
[最新記事] [過去ログ]