2005년 2월 25일 금요일

N모 종합연구소

이직을 하기위해 면접을 보고 있다.
일본에서 유명한 회사인 N모종합연구소에 면접결과가 오늘 나왔다.
일본어 능력 부족을 이유로 불합격..
음...일본어 능력이 부족한건 인정하지만 처음 응모해서 서류 전형을 통과한 포지션은 시스템 엔지니어 부문이었는데..
상류공정에 서의 일본어 사용능력이 부족하다는 애매한 대답이다.
시스템 엔지니어의 상류공정이라면 시스템 전반 설계,컨설팅 까지를 포함 한단 말인가?..

나 자신의 능력부족을 통감한다.
마음 한켠에는 내 일본어 능력이 그렇게 부족한가 라는 생각이 들기도 하고, 또 한켠에서는 일본어 를 커버 가능할 정도에 기술력을 키워야 겠다는 생각이 든다.

아무튼 능력부족을 극복해 보자.

[PostgreSQL] Non-superuser connection limit exceeded

JBOSS로 작성한 MBD로(큐방식 구현)메세지를 루프를 돌리며(최대20건 )send해본 결과 PostgreSQL의 connection문제로 에러 발생
DB설정 문제
表示されているエラーを見ると、
「非特権ユーザーの接続(数)の限界が超えています。」

ということなので、postgresql.conf の max_connections の項、
php.ini の pgsql.max_links, pgsql.max_persistent の項、
エラーが発生している時の、netstat -a の結果を見比べる。
とか、PostgreSQL が吐きだしているログを、PHP のログと見比
べたりしすると「何故なのか」わかるかもしれません。

そのエラーをみたらとりあえず、そんなことをしてみたくなり
ます。

postgresql.conf 의 max_connections수가 32 이던것을 96으로 변경후 1000건을 루프를 돌리며 send해본결과 문제없이 수행 완료 되었음

DB설정 변경이 불가능한 경우
스레드를 생성해 메세지 send 후에 wait(200ms)을준 결과 문제없이 수행

JBoss(4.x)MQ+PostgreSql

JBoss+Postgre에서 MDB설정 부분입니다.
DataSource 설정부분과 queue설정
그리고 권한 설정부분만 제대로 잡아주면 문제가 없을듯 합니다.
(JBoss 디폴트 설정부분이 남아 있어 지저분 하지만..)
회사 동료들을 위해 작성한 설정 자료를 그대로 올려봅니다.
Postgres는 버전 7.x에 pg73jdbc2ee.jar로 동작확인

以下のFileを上書きしてください。(CVSのtoolsJMS設定)
C:/jboss-4.0.1/server/default/deployjms下に
postgres-jdbc2-service.xml
postgres-jdbc-state-service.xml
jbossmq-service.xml
jbossmq-destinations-service.xml

C:/jboss-4.0.1/server/default/conf下に
login-config.xml
standardjbosscmp-jdbc.xml

hsql관련 파일을 삭제해 주십시요.

C:/jboss-4.0.1/server/default/deploy/hsqldb-ds.xml
C:j/boss-4.0.1/server/default/deploy/jmshsqldb-jdbc-state-service.xml
C:jboss-4.0.1/server/default/deploy/jms/hsqldb-jdbc2-service.xml

서버를 제 기동해 로그를 확인해 주십시요.

INFO [ConnectionFactoryBindingService] Bound connection factory for resource adapter for ConnectionManager
'jboss.jca:name=JmsXA,service=ConnectionFactoryBinding to JNDI name 'java:JmsXA'
INFO [WrapperDataSourceService] Bound connection factory for resource adapter for ConnectionManager 'jboss
.jca:name=PostgresDS,service=DataSourceBinding to JNDI name 'java:PostgresDS'
INFO [A] Bound to JNDI name: queue/A
INFO [B] Bound to JNDI name: queue/B
INFO [C] Bound to JNDI name: queue/C
INFO [D] Bound to JNDI name: queue/D
INFO [ex] Bound to JNDI name: queue/ex
INFO [testTopic] Bound to JNDI name: topic/testTopic
INFO [securedTopic] Bound to JNDI name: topic/securedTopic
INFO [testDurableTopic] Bound to JNDI name: topic/testDurableTopic
INFO [testQueue] Bound to JNDI name: queue/testQueue
INFO [drmRealTimeQueue] Bound to JNDI name: queue/drmRealTimeQueue
INFO [queue/drmRealTimeQueue] Bound to JNDI name: queue/queue/drmRealTimeQueue
INFO [UILServerILService] JBossMQ UIL service available at : /0.0.0.0:8093
INFO [DLQ] Bound to JNDI name: queue/DLQ





INFO [Http11Protocol] Coyote HTTP/1.1をポート http-0.0.0.0-8080 で起動します
INFO [ChannelSocket] JK2: ajp13 listening on /0.0.0.0:8009
INFO [JkMain] Jk running ID=0 time=0/32 config=null
INFO [Server] JBoss (MX MicroKernel) [4.0.1 (build: CVSTag=JBoss_4_0_1 date=200412230944)] Started in 22s:
540ms

以上LogPatternであればOKです。
以上の設定でOKですが、変更内容が知りたい方は下のを参考にしてください。
お疲れ様でした。

2005년 2월 17일 목요일

JBOSS 클러스트링 관련 문서

JBoss를 이용한 VOD관리시스템 2주차
http://h50146.www5.hp.com/products/software/oe/linux/summary/reference/pdfs/hp_jboss1.0.pdf

TDD

프로젝트 공통 PageUtil 클래스를 만들었다.
테스트 클래스 만들고 기반 메소드에서 문제가 될듯한 부분을 전부 테스트 했다.같이 일하고 있는 동료에게 사용해 보라고 했는데.(사용법은 테스트 클래스를 보면 알꺼라고..)3일 동안 딴일을 하느라 소스를 점검하지 못했었는데..
어제 저녁 test 리포트 에서 PageUtil관련 테스트 항목이 없어져 있는 것이 아닌가...
테스트 클래스는 삭제 되었고 ,PageUtil클래스는 이상한 방향으로 흘러 가고 있다..(물론 고쳐서 사용해 달라고 했지만..테스트 클래스는 반드시 갱신해 달라고 했는데..)
어쩌면 좋을까...

2005년 2월 16일 수요일

eclipsecolorer.sourceforge.net

이클립스 3.0x + jboss4.x에서 동작 확인 완료.
http://eclipsecolorer.sourceforge.net
http://eclipsecolorer.sourceforge.net/index_profiler.html
0.5.33 [show only this release]

2005년 2월 4일 금요일

本番環境Deploy

작년 7월부터 작업하던 프로젝트가 1차 릴리스 운용을 시작 하게 되었다.(록봉기 프로젝트와는 다른 프로젝트)
30분 후에 Deploy가 시작 된다.
오늘은 일찍 퇴근 할수 있을려나.

2005년 2월 3일 목요일

六本木生活三日目

가끔 내 블로그를 보는 일본인 동료들 때문에 일본어로 글을 올리는건 조심해야 겠다.
힘들다.
전부 CMP로 만들어 지고 있는 부분에 대해 수정이 필요하다고 말했다.오늘 그 회의 가 있었다.
검색 결과가 만건 가까이 되는걸 (그것도 CMR로 조인)CMP로 만들고 있다.뒤에서 보다가 안되는 건 아니지만 서버가 괜챤겠냐고
예기 한번 했더니 무슨 말이에요?그런다....
쩝...어찌하면 좋을까..

오늘 만든 DBUnit BaseClass

package xxx.framework.test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;

import org.dbunit.Assertion;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.database.QueryDataSet;
import org.dbunit.dataset.CompositeTable;
import org.dbunit.dataset.FilteredTableMetaData;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.ITable;
import org.dbunit.dataset.filter.DefaultColumnFilter;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.operation.DatabaseOperation;

import junit.framework.TestCase;
public class DBTestCase extends TestCase {

private DBinfo info = DBinfo.getInstance();

/**
* コンストラクタ。
*
*/
public DBTestCase() {
super();

}


/**
* 指定したテーブルのデータでXMLFileを作成します。
* @param arrayTables 対象テーブル名
* @param sFileName xmlファイル名
*/
protected void exportOp(String[] arrayTables, String sFileName)throws Exception {
info.init();
exportTable(arrayTables,new File(info.sExportDir_, sFileName));
}

/**
* XMLFileをDBに書き込みます。
* @param sFileName xmlファイル名
*/
protected void importOp(String sFileName)throws Exception {
info.init();
importTable(new File(info.sExportDir_, sFileName));
}

/**
* 指定したテーブルの現在データとXMLFileを比較します。
* @param arrayTables 対象テーブル名
* @param sFileName xmlファイル名
*/
protected void compareOp(String[] arrayTables, String sFileName) throws Exception{
info.init();
compareTable(arrayTables,new File(info.sExportDir_,sFileName),null);
}
/**
* 指定したテーブルの現在データとXMLFileを比較します。
* @param arrayTables 対象テーブル名
* @param sFileName xmlファイル名
* @param columns 比較対象外とするカラム名
*/
protected void compareOp(String[] arrayTables, String sFileName,String[] columns) throws Exception{
info.init();
compareTable(arrayTables,new File(info.sExportDir_,sFileName),columns);
}

private void compareTable(String[] arrayTables, File file,String[] columns) throws Exception {
IDatabaseConnection connection = null;

try {
connection = getConnection();
QueryDataSet partialDataSet = new QueryDataSet(connection);

for (int i = 0; i < arrayTables.length; i++) {
IDataSet databaseDataSet = getConnection().createDataSet();
ITable actualTable = databaseDataSet.getTable(arrayTables[i]);
IDataSet expectedDataSet = new FlatXmlDataSet(file);
ITable expectedTable = expectedDataSet.getTable(arrayTables[i]);
if(columns == null){
Assertion.assertEquals(actualTable, expectedTable);
}else{
DefaultColumnFilter columnFilter = new DefaultColumnFilter();
for(int x = 0; x < columns.length; x++) {
columnFilter.excludeColumn(columns[x]);
}
FilteredTableMetaData metaData = new FilteredTableMetaData(actualTable.getTableMetaData(), columnFilter);
ITable filteredTable = new CompositeTable(metaData, actualTable);
Assertion.assertEquals(filteredTable, expectedTable);
}
}
}finally {
if (connection != null) {
connection.close();
}
}
}


private void importTable(File file) throws Exception {

IDatabaseConnection connection = null;
try {
connection = getConnection();
FlatXmlDataSet dataSet = new FlatXmlDataSet(file);
DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);
} finally {
if (connection != null) {
connection.close();
}
}
}

private void exportTable(String[] arrayTables,File file) throws Exception{
IDatabaseConnection connection = null;
try {
connection = getConnection();
QueryDataSet partialDataSet = new QueryDataSet(connection);
for (int i = 0; i < arrayTables.length; i++) {
partialDataSet.addTable(arrayTables[i]);
}
FlatXmlDataSet.write(partialDataSet, new FileOutputStream(file));
} finally {
if (connection != null) {
connection.close();
}
}
}

private IDatabaseConnection getConnection()throws Exception {
Class driverClass =
Class.forName(info.sDriver_);

Connection jdbcConnection =
DriverManager.getConnection(
info.sUrl_, info.sUser_, info.sPassword_);

return new DatabaseConnection(jdbcConnection);
}

private void operation(DatabaseOperation operation,IDataSet dataSet)throws Exception {
IDatabaseConnection connection = null;
try {
connection = getConnection();
operation.execute(connection, dataSet);
} finally {
if (connection != null) {
connection.close();
}
}
}

private static class DBinfo{
private static final DBinfo INSTANCE = new DBinfo();
private boolean initialrized;
private Properties prop;
public String sDriver_;
public String sUrl_;
public String sUser_;
public String sPassword_;
public String sSchema_;
public String sExportDir_;


public void init() throws IOException, ClassNotFoundException {
if (initialrized) {
return;
}
synchronized (this) {
prop = new Properties();
InputStream resourceStream =
ClassLoader.getSystemResourceAsStream("dbunit.properties");

if (resourceStream == null) {
System.err.println("クラスパスにdbunit.propertiesがありません!!");
}
prop.load(resourceStream);
sDriver_ = prop.getProperty("driver");
sUrl_ = prop.getProperty("url");
sUser_ = prop.getProperty("user");
sPassword_ = prop.getProperty("password");
sSchema_ = prop.getProperty("schema");
sExportDir_ = prop.getProperty("exportDir");
Class.forName(sDriver_);
initialrized = true;
}
}

public static DBinfo getInstance() {
return INSTANCE;
}

}
}

2005년 2월 2일 수요일

코더 10명

코더라는 단어를 별로 좋아 하지는 않지만
이번 프로젝트에 참가 한 내 포지션이 PG..
이제까지는 아키텍쳐..(그게 그건가?하지만 선행 개발자 라고 해 두자.)

이번 프로젝트
개발 머신은 *HP*P4-540
모니터가 19인치라 눈이 아프다..어제까지 Thinkpad12인치 노트북 만 보다가 환경이 바뀌니 적응이 잘않된다..
ㅋㅋㅋ
개발 내용은 VOD관리 시스템..
사용자가 요건정의 가 명확히 되지 않은 상태에서 프로토타입 제작이 시작됬다.
개발 관련 툴들도 전부 오픈소스(JBOSS,LINUX,POSTGRES)라
운영인력 교육 같은 부분도 많이 필요 할듯한데..
어찌 하면 좋을까..
버그트레이싱 을 위해서 벽에다 버그 분류 시트를 붇이는데 까지는 성공했다..
일부분 코더 들에게 문제 발생 부분에대한 postit을 붇이는 작업도 요청해 6장을 붙였다.그중에 PM모니터에 2장 내모니터에 1장 나머지 3장은 벽에 붇어있다.
방금도 한장이 늘었다..일본 개발자들은 참 말하기를 싫어 한다..
한국 개발자 들도 그럴까?..

六本木生活二日目

六本木39皆で二日目。。
ちょっと不便なビルだ。
카치도키 보다 10분 정도 전차를 타는 시간은 줄었지만,
역에서 걸어오는 시간이 꽤 걸린다.(익숙해 지지 않아서 그런가.)
불편해도 경치는 죽인다.동경 시내가 한눈에 들어 오는
사진 찍어서 올려야 겠다..