2009年10月24日土曜日

Delphiでファイルの変化に反応するプログラム

よく、アプリケーションを使っていると、ファイルが他のプログラムで
変更されたことを検地する機能を持ったものがある。

これは、どうやってやっているんだろうかとぼんやりと思っていたのだけど、
必要に迫られることがなかったので、ずっと放置していたのだけども、
最近、ツールが作りたくなってこの機能があればスマートに実装できるので
ちょっと調べてみた。

すると、Delphiには、まさにそのためのコンポーネントがあるではないか。

それは、TShellChangeNotifierというクラス。

このクラスは、指定したフォルダ以下のファイルに変化があったら反応してくれる
コンポーネント。

下記が今回参考にしたサイトです。
http://www.geocities.jp/fjtkt/problems/2005_0008.html

2009年10月8日木曜日

シリアライズのテストプログラム

シリアライズをして復元するというようなプログラムをテストで
作ってみました。

いままではフレームワークで勝手にシリアライズしてくれるような部分で意識していなかった
部分だったのだけど、ちょっと自前で書いてみました。

Serializable なクラスをもつSerializable を作って
byte[]に格納した後に、そこからオブジェクトに復元してみる
というのを確かめたサンプルのソースコードです。

package SerializeTest;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import javax.xml.parsers.DocumentBuilder;

import org.w3c.dom.Document;

public class Main {

 /**
  * @param args
  * @throws IOException 
  * @throws ClassNotFoundException 
  */
 public static void main(String[] args) throws IOException, ClassNotFoundException {
  classA  test = new classA();
//  DocumentBuilder docbu = DocumentBuilder.get;
  test.setLoginInfo(new LoginInfo("useree","passhhh"));
  test.setVal1("かきくけこ");
  test.setVal2("あいうえお");
  System.out.println(test.toString());
  
  ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
  ObjectOutputStream p = new ObjectOutputStream(baos);

  p.writeObject(test);
  p.writeObject("String");

  p.flush();
  byte [] bit = baos.toByteArray();
  baos.close();
    //
  ByteArrayInputStream bais = new ByteArrayInputStream(bit); 
  ObjectInputStream ois = new ObjectInputStream(bais);
  classA cla = (classA ) ois.readObject();
  String str = (String ) ois.readObject();
  System.out.println(cla.toString());
  System.out.println(str);
 }

}
 

============================
package SerializeTest;

import java.io.Serializable;

public class classA implements Serializable {
 /**
  * 
  */
 private static final long serialVersionUID = -345225844394172659L;
 LoginInfo loginInfo;
 String val1 ;
 String val2 ;
 
 public LoginInfo getLoginInfo() {
  return loginInfo;
 }

 public void setLoginInfo(LoginInfo loginInfo) {
  this.loginInfo = loginInfo;
 }

 public String getVal1() {
  return val1;
 }

 public void setVal1(String val1) {
  this.val1 = val1;
 }

 public String getVal2() {
  return val2;
 }

 public void setVal2(String val2) {
  this.val2 = val2;
 }

 public String toString(){
  return loginInfo.getUserName()
       +"/"+loginInfo.getPassword()
  +"/"+val1+"/"+val2;
 }
 
}

===============================
package SerializeTest;

import java.io.Serializable;

public class LoginInfo implements Serializable {
 /**
  * 
  */
 private static final long serialVersionUID = -8712859729005134670L;
 private String userName;
 private String password;
 public LoginInfo(String string, String string2) {
  userName =string;
  password=string2;
 }
 public String getUserName() {
  return userName;
 }
 public void setUserName(String userName) {
  this.userName = userName;
 }
 public String getPassword() {
  return password;
 }
 public void setPassword(String password) {
  this.password = password;
 }

}
 



2009年9月28日月曜日

EJBの仕組み概要

EJBって聞いたことはあるけどよく知らなかった仕組みなんで、
理解しようとしてみた。

初心者には、このページがわかりやすかった。

JBossで学ぶEJB入門

第二回までは、EJBの一般論が書かれているので、JBossでなくても
通用する話でした。

2009年9月19日土曜日

OracleでNotNull制約を解除する

先日、Oracleのテーブル定義でNotNull制約を解除するAlter文ってどう書くんだろう
ということではまってしまった。

ALTER TABLE XXXXXX MODIFY (YYYYYY VARchar(20))


とやってみてもNotNull制約は解除されない。正しくは、下記のように書くんですね。
ALTER TABLE XXXXXX MODIFY (YYYYYY VARchar(20) NULL)

2009年9月16日水曜日

DelphiアプリケーションのWindowsのダンプファイルの調査のしかた

Windowsファイルが出力するダンプファイルなんで今まで遠ざけていたのだけど、
ちょっとチャレンジしてみた。

まず、必要なものは、windbgというマイクロソフトの無料のツール
これは、下記から説明およびダウンロードができる。

http://www.microsoft.com/japan/whdc/devtools/debugging/debugstart.mspx

次にDelphiのアプリケーションからは、生成されないマップ情報を生成する必要が
あるのだけど、それは、下記のDelphiのmapファイルをdbgファイルに
変換してくれる便利なツール「map2dbg」があるようです。

参考になったサイトは下記のサイト(英文)です。
http://www.sandon.it/?q=node/45

これらを踏まえた上で、下記のサイトを見てwindbgを使ってみると、
スタックとレースを見ることが出来るという部分までが理解できた。

クラッシュダンプを読んでその原因を究明する

いろいろ見てみると、
STACK_TEXT:

という部分あたりに、関数の呼び出し履歴みたいなのが表示されるようです。

現実問題、これがわかるだけでも結構でかいなぁ....

昔、この本を読もうとして、ちょっとやめたのだけど、やっぱり読んでみようかな
とまた思い始めてみる。
Windowsダンプの極意 エラーが発生したら、まずダンプ解析! (大型本)





2009年9月15日火曜日

XMLDocumentをStringにする

XML処理のデバッグなどをしていると、
XMLDocumentをStringにしてみてみたいなぁと思い、それをする方法を調べていたら
下記のページにたどり着いた。

Java Technology & XML - Re: how to transform a dom object to String?

これをほんのちょっとだけ、アレンジして下記のようなmethodを作ったところ
イメージどおりの動作をしてくれました。

 private static String getStringFromDocument(Document doc){
   String str=null;
   try {
     TransformerFactory tfac = TransformerFactory.newInstance();
     StringWriter strWtr = new StringWriter();
     StreamResult strResult = new StreamResult(strWtr);
     Transformer trans = tfac.newTransformer();
     trans.transform(new DOMSource(doc.getDocumentElement()), strResult);
     str =strResult.getWriter().toString();  } 
   catch (TransformerException te) {
    te.printStackTrace();
   }
   return str;
 }
 

これで、どこがおかしかったのかを突き止めることが出来ました。

2009年9月5日土曜日

Google App Engine SDK 1.2.5リリース

Google App Engineのブログを見ていると新バージョンが出たというニュースが書かれていた。

App Engine SDK 1.2.5 released for Python and Java, now with XMPP support 

今回の目玉新機能としては、

XMPP Support

ということだそうです。
XMPPなんてよく知らなかったけど、GoogleTalkなんかでも利用されている
メッセンジャー系の仕様みたいです。

XMPPとは 【eXtensible Messaging and Presence Protocol】

また、今回は初のPythonとJavagの同時リリースということみたいです。
いままでJavaは遅れてのリリースだったのでPythonだけしかない機能が結構あったけど、
これはうれしい知らせです。

また、いつの間にかGoogle Plugin for Eclipse がEclipse 3.5 (Galileo)に対応したようなので
eclipseも3.5に更新しておきました。

3.5ではsoftware updateのメニュー構成が若干変わっていて少々戸惑いました。

インストール方法は、下記のページに書かれています。
Installing the Google Plugin for Eclipse