'pds'에 해당되는 글 8건

  1. 2012.12.19 그들이 위임했을뿐
  2. 2009.07.26 AL Client (XUL Sample)
  3. 2009.07.24 AL Ver 0.1
  4. 2009.04.12 AL의 첫 테스트 버전
  5. 2009.02.19 Framework - Source
  6. 2009.01.15 Bleujin Framework Jar
  7. 2009.01.12 Database 발표 자료
  8. 2009.01.12 UTF-8 발표자료
pds2012. 12. 19. 21:17
우리는 국민들에게 강요하지 않았다.
그들이 우리에게 위임했을 뿐
그리고 그들은 그 댓가를 치루는 거다.


from 괴벨

지옥(Hell) 끝 -> 지옥불(Inferno) 시작.


'pds' 카테고리의 다른 글

AL Client (XUL Sample)  (0) 2009.07.26
AL Ver 0.1  (0) 2009.07.24
AL의 첫 테스트 버전  (0) 2009.04.12
Framework - Source  (0) 2009.02.19
Bleujin Framework Jar  (0) 2009.01.15
Posted by bleujin
pds2009. 7. 26. 13:27


AL을 사용하는 Web이 아닌 다른 예제를 만들어 볼려고 했던 샘플이다. 

XUL을 사용했는데 처음 사용할때 View 목적을 위해서는 장점이 많아서 AL 관리프로그램으로 만들려고 했지만. 
Action이 들어가는 순간 XUL의 목적에도 맞지 않고 실제로 사용하기에도 무척 까다롭다는걸 한달 반 헤딩하고 깨달았다-ㅅ-

그래서 일명 시망-ㅅ-프로그램으로 
Edit Action와 관련한 기능은 작동하지 않고 View 기능만 제대로 동작한다. 
현재로서는 XUL의 한계를 느껴서 더이상 이프로그램을 패키징을 할 생각이 없지만..
나름 Lucene의 Side OpenSource인 LukeAll을 흉내내서 PlugIn 방식이라든가 신경을 많이 쓴게 아까워서 일단 올려봄. 
(각 화면은 Let 형태로 별도로 동작하고 뭉쳐서도 동작하는 독특(?)한 아키텍쳐를 가지고 있다. 이 방식을 사용한 이유는 테스트의 용이성때문이다. )

이전의 WebSample은 AL의 아주 일부분의 기능만 사용했지만. 
XUL Sample은 AL에서 지원하는 기능의 50%정도를 사용한다. 


실행방법은 이전 pds의 framework_core.jar와 anotherLore.jar가 있는 디렉토리에  해당 디렉토리 프롬프트 창에서 java -jar anotherLore_client.jar를 실행하면 된다.(jar 확장자가 인식되면 dblClick로도 실행)


Reset AnotherLore : 샘플노드와 관련 타입등을 지운다. 
Load SampleData : 샘플 노드와 관련 타입등을 만든다. 
을 선택하고 OK 클릭. 


최근 어느책에서 본건데 24시간 무정지 시스템은 달리는 자동차에서 엔진을 교체하는것과 같다고 한다. 그러나 그보다 최악은 달리는 자동차의 엔진을 만드는 일이다. 나는 이전에 그런 경험을 하면서 다시는 그와 비슷한 일이 발생하지 않도록 엔진을 만들때 여러개의 MockUp자동차를 만들기로 했고 WebSample의 AL의 찰흙로 만든 자동차라면 XULExample는 나무로 만든 자동차 같다. 


'pds' 카테고리의 다른 글

그들이 위임했을뿐  (0) 2012.12.19
AL Ver 0.1  (0) 2009.07.24
AL의 첫 테스트 버전  (0) 2009.04.12
Framework - Source  (0) 2009.02.19
Bleujin Framework Jar  (0) 2009.01.15
Posted by bleujin
pds2009. 7. 24. 09:37

아마도 3달전에 늦어도 2달전에는 Open 할수 있었지만..
다른걸 좀 만드느라 패키징을 미루다 보니 이제서야 오픈. 

4개의 파일(10M이내로 등록하기 위해 Layer 별로 분리)

framework_core.jar : 기본적인 system framework...(db, configuration, log 등등)
anotherLore.jar : AL core
anotherLore_web.jar : AL을 사용한 Web Example(struts)
webapps.zip : jsp, js

3개의 jar를 같은 디렉토리에 놓고 webapps.zip을 그 디렉토리에 압축을 푼후
(다운로드 받을때 티스토리에서 보안때문인지 확장자를 바꿔버리는것 주의.)

해당 디렉토리 도스 프롬프트에서 java -jar anotherLore_web.jar 라고 실행하면 WebServer가 기동
http://localhost:8080/board/ 에서 확인 가능.


이전과 다른점은 Oracle을 사용하지 않아도 샘플의 실행과 테스트의 용이성을 위해서  File에 write를 한다. 십만건 이상에 Session이 많을 경우 DB를 써야 하겠지만 그 이하라면 파일로도 처리가 가능. 
다만 File 저장소는 테스트용으로 만들어서 write가 많이 일어나는 경우 동시성이 취약함. 테스트 용이성을 위해 만들었지만 데이타 캐쉬나 분산연산등의 역할을 담당할 수도 있는 추가적인 장점이 많이 있어서 보완중.

config file : default-config.xml, anotherlore-config.xml

정확한 테스트는 아니지만 
5개 Active Thread로 대충 초당 10건 write, 초당 300건 read 정도 ?

5WriterThread * 10회 반복 + 50ReaderThread * 10회 반복 = 7.5초.

anotherLore java soruce.... 













'pds' 카테고리의 다른 글

그들이 위임했을뿐  (0) 2012.12.19
AL Client (XUL Sample)  (0) 2009.07.26
AL의 첫 테스트 버전  (0) 2009.04.12
Framework - Source  (0) 2009.02.19
Bleujin Framework Jar  (0) 2009.01.15
Posted by bleujin
pds2009. 4. 12. 23:42



실행방법 :
1. 파일을 다운로드 받는다(http://drop.io/datptht/asset/anotherlore-jar  anotherLore.jar 약 30M)
2. 알집으로 열어서 webapps/ 디렉토리만 현재 디렉토리에 압축을 푼다.
   현재 디렉토리에 다운 받은 jar 파일 하나와 webaspps 디렉토리가 있어야 한다.
   현재 디렉토리 
       -  anotherLore.jar
       -  webapps/
3. command 창에서 java -jar anotherLore.jar 로 실행(require JRE1.5 higher)한다. (jetty server가 기동한다.)
4. http://localhost:8080/board/   로 접속한다.. 끝. -ㅅ- (중단하려면 Ctrl+c를 누른다.)




============== 4월 12일

1. noticeType은 versionable 시키지 않았기에 상관없지만 generalBoard는 versionable code로 되어 있었는데 버전을 3번 수정하는 PK 오류가 나는 걸 수정.

2. 불필요하게 nodeType을 매번 억세스 하는 걸 수정.

3. Property.Type에 virtualText, referenceType 추가.
예컨데 generalBoard의 2번째 Textarea는 VirtualText Type으로 되어 있는데 벨로시티 템플릿을 사용한다.
아래와 같이 입력/수정 할 경우..
$node.getUUIDString() <br/><br/>
#foreach($n in $node.getNodeByPath('/').getChildNode())
   $n<br/>
#end
View 화면에서는 위의 템플릿이 적용된 다른 내용이 보이게 된다. $node는 현재 node를 가르키지만 이를 통해 모든 node를 억세스 가능하다.

4. 파일공유 사이트 바꿈.

=============== 4월 5일
AL은 DataStore를 확인할 수 있는 NodeTypeInfo, NodeInfo Page가 있고

AL로 만든 간단한 Sample Program인 Notice, GeneralBoard, Diagram 3가지가 있다.
AL은 게시판을 만들어 주는 어드민 모드 프로그램이 아니라 프로그램를 만드는 프로그램이다. 3가지의 다른 데이타 모델을 사용하는 샘플 프로그램은 모두 같은 인터페이스 모델로 저장이 된다.

모든 DataModel은 NodeType으로 쉽게 만들수 있다.
anotherLore.jar의 com.bleuji.lore.impl.board에 위의 3개의 샘플 프로그램 소스가 있는데 예를 들어 데이타 모델은 아래와 같이 만들면 된다.


  private void initBoard(AnotherLore lorethrows RepositoryException {

    UserSession session = lore.login(new TestCredential("admin")"localhost");
    globalStore = session.getGlobalStore();

    NodeType objectType = globalStore.createNodeType(NodeType.NO_SUPERTYPE, "_object"new PropertyDefinition[0]);
    Node root = session.createNode(Node.NO_PARENT, objectType, "/");
    Node anonymousRoot = session.createNode(root, objectType, "anonymous");

    // notice DataModel
    NodeType noticeBoardType = globalStore.createNodeType(objectType, "notice_board"new PropertyDefinition[0]);

    PropertyDefinition boardNo = createProperty(BOARDNO, Property.Type.LONG);
    PropertyDefinition subject = createProperty(SUBJECT, Property.Type.STRING);
    PropertyDefinition regUserId = createProperty(REGUSERID, Property.Type.STRING);
    PropertyDefinition regDate = createProperty(REGDATE, Property.Type.DATE);
    PropertyDefinition content = createProperty(CONTENT, Property.Type.STRING);

    PropertyDefinition[] noticeProperties = new PropertyDefinition[] { boardNo, subject, regUserId, regDate, content };
    NodeType noticeType = globalStore.createNodeType(objectType, "notice", noticeProperties);

    noticeType.addPropertyConstraint(boardNo, new NumberConstraint());
    noticeType.addPropertyConstraint(subject, new RangeByteLengthConstraint(1200));
    noticeType.addPropertyConstraint(regUserId, new RequireConstraint());
    noticeType.addPropertyConstraint(regDate, new RequireConstraint());

    noticeBoardType.setMemberType(noticeType);

    Node noticeBoardRootNode = session.createNode(root, noticeBoardType, "noticeboard");

    // extend board Data Model
    NodeType generalBoardType = globalStore.createNodeType(objectType, "general_board"new PropertyDefinition[0]);
    NodeType articleType = globalStore.createNodeType(noticeType, "article"new PropertyDefinition[] { createProperty(ATTACH_FILE, Property.Type.BINARY),
        createProperty(FORMET_TEXT, Property.Type.VIRTUAL_TEXT) });
    articleType.addPropertyConstraint(boardNo, new NumberConstraint());
    articleType.addPropertyConstraint(subject, new RangeByteLengthConstraint(1200));
    articleType.addPropertyConstraint(regUserId, new RequireConstraint());
    articleType.addPropertyConstraint(regDate, new RequireConstraint());

    PropertyDefinition comment = createProperty(COMMENT, Property.Type.STRING);
    NodeType commentType = globalStore.createNodeType(objectType, "comment"new PropertyDefinition[] { comment, regUserId, regDate });
    commentType.addPropertyConstraint(comment, new RangeByteLengthConstraint(104000));
    commentType.addPropertyConstraint(regUserId, new RequireConstraint());
    commentType.addPropertyConstraint(regDate, new RequireConstraint());

    articleType.setMemberType(commentType);

    Node generalBoardRootNode = session.createNode(root, generalBoardType, "generalboard");
    generalBoardType.setMemberType(articleType);

    // web note(diagram) Data Model
    PropertyDefinition name = createProperty("name", Property.Type.STRING);
    PropertyDefinition nextNoteNum = createProperty("nextNoteNum", Property.Type.INTEGER);
    NodeType workspaceType = globalStore.createNodeType(objectType, "workspace_type"new PropertyDefinition[] { name, nextNoteNum });
    workspaceType.addPropertyConstraint(name, new RequireConstraint());
    workspaceType.addPropertyConstraint(nextNoteNum, new RequireConstraint());

    PropertyDefinition note_content = createProperty("note_content", Property.Type.STRING);
    NodeType noteType = globalStore.createNodeType(objectType, "note_type"new PropertyDefinition[] { note_content });
    noteType.addPropertyConstraint(content, new RequireConstraint());

    Node workspace = session.createNode(session.getNodeByPath("/"), workspaceType, "workspace");

    session.save();
    session.logout();

  }

  private PropertyDefinition createProperty(String pid, Property.Type requireTypethrows RepositoryException {
    return globalStore.createPropertyDefinition(pid, requireType);
  }

}

API는 가능한 jcr170과 비슷하게 하려고는 했지만 여러가지 자잘한 이유로 조금씩 변경했다.
예컨데 new RequireConstraint()라는 constraint는 실제로는 데이타베이스에 
<configured-object>
   <class-name>com.bleujin.lore.core.constraint.RequireConstraint</class-name>
</configured-object>
와 같은 XML 형태로 저장이 된다.




AL의 기본 모드는 인메모리에서 동작하게 되어 있다. 따라서
만약 오라클에 저장을 하고 싶으면

 webapps/board/WEB-INF/default-config.xml 파일을 열어서 

1. root.database-controller.database-manager 에 userId, userPassword, jdbcURL을 설정하고
 (해당 아이디는 connect, resource 권한을 가지고 있어야 한다.)
 
2. root.license.startmode를 oracle:recreate로 바꿔주고 재시동하면 된다. 


오라클을 DataStore로 사용했을 경우 root.license.startmode에는
  oracle:recreate, oracle:reset, oracle:none 3가지를 적용할 수 있는데, 

1)  oracle:recreate는 시작할때 관련 테이블과 sequence를 모두 지우고(없으면 무시) 다시 테이블등의 세그먼트를 만든다.
2)  oracle:reset 세그먼트를 다시 만들지는 않지만 테이블의 데이타는 모두 지우고 시작한다. 
3)  oracle:none 이미 오라클에 관련 테이블이 있다면 그냥 아무짓 안하고 시작한다.(이전에 저장했던 데이타가 남는다.)

  처음 오라클 모드로 시작하는 거면 oracle:recreate로 시작한다. (가능한 쉬운 기동을 위해 과정을 단순하게 만들려고 했다.)


generalBoard를 통해 업데이트 되는 Binary형태의 Property는 root.file-repository-path를 수정하지 않으면 /another/data/property에 저장이 되고 파일정보만 AL에 저장된다.


실제 많은 사용자를 버티려면 TypeCache를 적용해야 하지만 NoCache JIT 상태로도 그럭저럭 빠른 속도를 보여준다. 나중에 자세한 성능 테스트 자료를 올리겠음.(국내에 30M 정도를 공유할 수 있는 쓸만한 웹하드 사이트가 없다는 걸 이 글 작성하면서 처음 알았다 -ㅅ-)




'pds' 카테고리의 다른 글

AL Client (XUL Sample)  (0) 2009.07.26
AL Ver 0.1  (0) 2009.07.24
Framework - Source  (0) 2009.02.19
Bleujin Framework Jar  (0) 2009.01.15
Database 발표 자료  (0) 2009.01.12
Posted by bleujin
pds2009. 2. 19. 23:31

이 블로그에서 소개하고 있는 프레임워크 소스이다.

이 블로그에서는 그중에 DB와 Valid만 언급한다.



오픈 소스 라이브러를 많이 사용하였기 때문에
실제 컴파일 하려면

common-beanutils.jar
common-collections.jar
common-digester.jar
common-fileupload.jar
common-io.jar
common-lang.jar
common-logging.jar
common-net.jar
common-pool.jar
등의 아파치 오픈소스 라이브러리가 필요하고

db쪽은 mssql, oracle, h2, mysql, hsql 등을 지원하기 때문에 해당 JDBC 라이브러리들이 필요하다.
그밖에 zsql.jar, jericho-html.jar, jmock-core.jar, junit.jar 등이 필요함.
같이 올릴려고 했는데 10M 용량제한때문에 못올렸다.

도움말이 그닥 충실하게 되어 있지 않기때문에 그냥 참고만 하고 실제 이용을 한다면 그냥 jar를 하는게 좋다 -ㅅ-

원래 사이즈는 더 컸는데.. 일부 기능은 framework_ext로 별도로 빼버렸다.



Closed Cursor 때문에 이전에 jdeveloper site에서 일부 소스를 가져왔는데. java 1.5에서 WebRowset이 interface로 추가되었다. internal한 구현이 있어 java 1.5의 인터페이스를 상속해서 만들기엔 어려움이 있어 아직도 1.4 impl 버전을 사용해야 한다.

'pds' 카테고리의 다른 글

AL Ver 0.1  (0) 2009.07.24
AL의 첫 테스트 버전  (0) 2009.04.12
Bleujin Framework Jar  (0) 2009.01.15
Database 발표 자료  (0) 2009.01.12
UTF-8 발표자료  (0) 2009.01.12
Posted by bleujin
pds2009. 1. 15. 08:44

2003년에 처음 작성 아직까지 잘 쓰고 있는 Java로 작성된 System Framework..

개인적으로는 Apache 어느 오픈소스와 비교해도 설계사상과 코드품질에 대해서는 자신이 있는..
언젠가 이와 관련한 글을 올릴 수 있기를...


전체를 모두 올렸다가 잘 사용하지 않는 부분은 ext부분으로 따로 빼버리고

  - Configuration
  - Database
  - exception handling
  - logging
  - parse.html
  - schedule

만 따로 묶었다.


https://github.com/bleujin/ionframework  로 프로젝트 이동.


'pds' 카테고리의 다른 글

AL Ver 0.1  (0) 2009.07.24
AL의 첫 테스트 버전  (0) 2009.04.12
Framework - Source  (0) 2009.02.19
Database 발표 자료  (0) 2009.01.12
UTF-8 발표자료  (0) 2009.01.12
Posted by bleujin
pds2009. 1. 12. 15:06

꽤 오래 울궈먹은 자료-ㅅ-

2005년도 쯤에 처음 작성.. 그후로 조금씩 수정하면서 여러번 써먹었...


- RDB 아키텍쳐의 구조
- 인덱스의 원리
- 조인의 원리

'pds' 카테고리의 다른 글

AL Ver 0.1  (0) 2009.07.24
AL의 첫 테스트 버전  (0) 2009.04.12
Framework - Source  (0) 2009.02.19
Bleujin Framework Jar  (0) 2009.01.15
UTF-8 발표자료  (0) 2009.01.12
Posted by bleujin
pds2009. 1. 12. 15:04


2006년쯤에던가.. 하여튼 그 쯤에 UTF-8 에 대해 발표한 자료..

사내 발표 자료였는데.. 어느 순간 인터넷에서 떠돌아 다니는걸 보고 깜짝 -ㅅ-

그때나 지금이나 그리고 조엘에 따르면 15년 전에도 UTF에 대해 알고 있는 개발자의 비율은 변치않고 있다. 


일반적인 UTF 얘기와 오라클에서의 UTF의 의미

  - Global Software ?
  - Example
  - Lenend of ASCII
  - Myth of Unicode
  - Oracle NLS
  - 참조

'pds' 카테고리의 다른 글

AL Ver 0.1  (0) 2009.07.24
AL의 첫 테스트 버전  (0) 2009.04.12
Framework - Source  (0) 2009.02.19
Bleujin Framework Jar  (0) 2009.01.15
Database 발표 자료  (0) 2009.01.12
Posted by bleujin