IT/후기2016. 8. 16. 15:09

Pycon 2016 정리


작년에 일정에 쫓겨 못갔지만 이번 파이선은 아주 천재일우의 기회로 다녀오게 됨. 그것도 3일간 풀로 말이다. 물론 기대가 너무 커서 실망도 크지만 얻은것도 많았다. 대부분 ML 주제가 거의 차지한 거같았다. 다른 세션은 많이 비우는 경우도 생기고. 데이터 분석이 대세인가 싶다. 마지막 날은 튜토리얼 하는 날인데 가서 실제로 Django가지고 간단한 웹서비스도 만들었고 이를 cloud에 배포까지 해보는 실습을 해보면서 장고걸스 / django를 알아보는 좋은 기회도 있었다. 


아래는 내가 우선 놓친(다른 것을 듣느라) 세션들이다. 나중에 유투브가 올라오면 영상까지 볼 만한 것들이다.

뉴스를 재미있게 만드는 방법; 뉴스잼 링크

Django로 쇼핑몰 만들자 링크

Basic Statistics with Python 링크

TOROS: Python Framework for Recommender System 링크

파이썬으로 기초 산수 풀어보기 (이것은 튜토리얼이므로 나중에 업데이트할 예정)

Python으로 IoT, 인지(Cognitive), 머신러닝 삼종세트 활용하기 링크

Django vs Flask, 까봅시다! 링크

검색 로그 시스템 with Python 링크

Decision making with Genetic Algorithms using DEAP 링크

파이썬 데이터 분석 3종 세트 - statsmodels, scikit-learn, theano 링크  


나중에 들은것은 다시 강의 보고 한번 내용 요약해서 올릴 예정.


'IT > 후기' 카테고리의 다른 글

Polyglot Programming  (0) 2015.03.13
2013 JCO 후기  (0) 2013.02.23
Posted by 억사마
IT/후기2015. 3. 13. 13:51

아주 간만에 흥미로운 책을 읽었다. Polyglot 이라고 프로그래밍을 여러개 할 줄 아는 능력을 갖추라는 메시지가 담긴 책이다.

저자 임백준씨의 책은 대학교때 한손으로 뽑을 정도로 적게 읽었던 책중에 행복한 프로그래밍의 책부터 한권도 빠짐없이 보고 있다. 

아는 것이 참 많으신듯. 람다와 클로저의 개념도 쉽게 설명을 해주시고 많은 레퍼런스도 공유를 해주셨다.



스택오버플로우 사이트는 개발자면 다 아는 사이트이다. 이 사이트를 만든 사람 중 아트우드는 조엘 온 소프트웨어 저자 ,조엘 스폴스키와    stackoverflow를 만들고 이곳을  떠나서 대화 담화 의견의 교환 등을 의미하는 discourse.org 라는 웹사이트를 개발한다. 위키북스라는 책도 찾아보자. 



ㅇ Podcast

  'ted neward podcast'라고 검색하면 여럿 나옴.


ㅇ 람다와 클로저 

람다는 익명 메서드라고 보며, 코드조각 혹은 표현을 다른 객체나 메서드에 전달하기 위한 표현식이고. 

클로저는 외부에서 정의된 변수를 참조하는 코드조각 혹은 표현


public void foo()  {

int i = 0;

JButton  button = new JButton("Click me");

button.addActionListener( new ActionListener() {

// 이책에선 아래의 함수 정의 자체가 행사코드 

라고 표현

@Override

public void actionPerformed(ActionEvent e) {

System.out.println(i);

}

});

}


에서,  System.out.println(i);에서 i가 빠지면 람다이긴 하나 클로저가 아닌거라는 말이다.


ㅇ 코드의 변경불가능성 (블로흐 effective java)

 - 객체의 상태를 변경시키는 메서드를 제공하지 마라 

 - 클래스가 상속되지 못하도록 하라 

 - 모든 필드를 final로 선언하라

 - 모든 필드를 private로 선언하라

 - 변경불가능성을 만족시키지 못하는 컴포넌트에  대한 접근을 통제하라.

-  닐 게프터 vs 블로흐  (닐 게프터는 자바는 꽁꽁 얼어붙은 심해였다.)



ㅇ Scala 사용예

사회적 그래프를 역정규화된 사용자 ID의 리스트 형태로 저장하기 위해 Flock이라는 도구를 사용 

Hawkwind라는 스칼라로 구현된 서비스를 사용 : 트위터 사용자 검색엔진

호스버드 Hosebird : 공공 검색엔진에게 스트림으로 전송, http 기반의 지속적인 연결 시스템. 스칼라를 이용해서 jETTY 위에 우리만의 시스템 구현


시라는 것은 궁국의 압축이다. 감정의 철학과 깨달음과 메시지와 소통을, 치열한 사색과 고민으로 여과하여 간결한 언어 안에 압축시킨 것이라는 글귀에 시 한권 읽어야겠다는 생각도 들었다. 프로그래밍과 참 유사해야한다라는 말에 공감이 간다.



[형식 언어의 정의를 위한 새로운 접근법과 오테론에서의 응용] 라는 논문도 찾아서 보면 프로그래밍의 원리 이해에 도움이 될것 같다.




아래의 함수 프로그래밍 개념을 "Functional Programming for Java Developer(저자 Dean Wampler)"라는 책을 보고 익히자.

- 변경불가능성

- 일급함수

- 람다와 클로저

- 고차함수

- 재귀

- 게으른 평가

- 함수 합성

- 모나드


'IT > 후기' 카테고리의 다른 글

PyconKR 2016 정리  (0) 2016.08.16
2013 JCO 후기  (0) 2013.02.23
Posted by 억사마
IT/Tool2015. 3. 3. 10:32

PowerShell 익숙해지기.


- 비공개로 시작

- 필자는 자바 프로젝트를 git으로 갈아타면서 기존의 svn의 .svn폴더들을 일괄 삭제를 하고 싶어졌다.

svn export로 간단히 해결되지만 svn이 설치가 안되어 있어서 구글에서 커맨드라인에서 일괄 삭제할수 있는 배치 성격의 스크립트가 있나서 찾아보았으나 "파워쉘" 많이도 들어봤지만 써보지도 못한 그녀석의 스크립트 발견. native application으로  이미 윈도우에 포함이 되어 있어서 아래의 스크립트로 간단히 실행하여 일괄 삭제를 하였다. 

gci -fil '.svn' -r -force | ri -r -force

-참고

http://stackoverflow.com/questions/4889619/command-to-recursively-remove-all-svn-directories-on-windows



'IT > Tool' 카테고리의 다른 글

Git  (0) 2013.04.01
캡쳐부터 자동 웹업로드되는 막강 툴! Cropper!  (0) 2013.03.25
JMeter  (0) 2013.02.26
JMeter - Java Request  (0) 2013.02.18
Posted by 억사마
IT/오픈소스2013. 4. 18. 13:33

현재 JMS의 Queue기능을 사용코자 고려하여 선별한 오픈소스가 현재 테스트중인 HornetQ, ActiveMQ가 있고 AMQP를 사용한 RabbitMQ 입니다. 

타룬이 결국 Queue의 대체안이 없을 경우 사용한다는 전제하이고, 윤성종책임님과 제가 진행중인것은 큐를 적용한 버젼이므로 큐에 대한 확정을 하고자 이글을 씁니다.


우선 성능비교를 해보겠습니다. 

이 자료는 구글에서 제일 상단에 조회되는 최근 벤치마킹 자료글을 참조하였습니다. (여기 참조)

시나리오는 키정보를 담기 위함이므로 메시지 사이즈는 32byte, 그리고 worst case를 고려한 200,000건의 메시지가 동시에 enqueuing과 dequeuing이 일어나는 시나리오 C를  선택하여 성능비교를 하겠습니다.

위 시나리오로 제품 비교한 그래프는 다음과 같습니다.

참고) AMQP에 대한 얘기는  이 벤치마크 자료를 보면 RabbitMQ가 AMQP와 STOMP버젼이 두개가 있어 비교를 해보면 훨씬 빠른것처럼 보이나 아래와 같이 분명 경고글은 있습니다.


그럼 결과 확인전에 상기할 것은 여기 벤치마크는 단일큐를 가지고 성능을 비교한 것입니다. 그래서 RabbitMQ나 Hornetq같이 database persistence를 지원하지 않는 JMS도 persistent라고 표현 한 것이구요. 그래서 제가 직접 이 벤치마크를 한 분에게 질문을 드렸더니 아래와 같이 상세하게 답변을 주셨습니다.  


자, 그러면 Database Persistence가 필요하다고 하면 HornetQ, RabbitMQ도 제외가 됩니다. 그리고 대안은 ActiveMQ로 가는수밖에 없구요.

어제 Tarun이 얘기한 replicatoin을 써서 failover가 커버 가능하다고 했는데 아래는 제가 찾은 인터넷에 레퍼런스 정리입니다.  

1 ) HornetQ는 JBoss Messaging Server의 자식인데, 이 부모의 Database Persistance 기능이 없어지고  File Persistance(Journal이라고 부름)로 가면서 Failover에 대해서 100% 보장은 못한다는 의견이 많다. 그리고 현재 production system에서는 여전히 JBoss Messaing Server가 Database persistence 기능 때문에 업데이트없이 여전히 많이 사용중이라고 합니다.

2)  현재 HornetQ 최근 릴리즈된 버젼에 벤치마크 관련 얘기가 830만건의 메시지를 1초에 처리한다고 성능테스트 자료도 나와있다. 하지만 메시지 유실에 가능성은 있다고 분명히 언급이 되어 있다...   


마지막으로 RabbitMQ에 대한 얘길 적어보겠습니다.  성능이 좋은 프로토콜인  AMQP 얘기가 나오면서 대안으로 나왔는데 Database Persistence 가 지원이 안됩니다. Mnesia라는 데이터베이스( 분산형 데이터베이스 소프트웨어)에 자체 내부적으로 사용하여 RAM용량이 없을 경우에만 허용한다고 한다. (여기 참조)


그래서 제 생각은 ActiveMQ로 가는게 맞다고 봅니다. Databse Persistence가 없이 Clustered Queue의 Failover 처리가 완벽하다면 성능이 좋은 RabbitMQ (AMQP) 로 가는게 좋구요.


----

같은 레드햇에서 JBoss HornetQ와 MRG에 대해 비교하는 글이 있네요

https://community.jboss.org/thread/167032?tstart=0

Posted by 억사마
IT/Tool2013. 4. 1. 15:41

Git

아래 내용은 필자의 프로젝트 적용시에 좌충우돌 겪으면서 간단한 레퍼런스는 넘어 트러블슈팅했던 내용을 담아 Git에 대해 일기같이 기록을 담아둘려고 적는 기록이다.


1. GitHub 등록

2. http://code.google.com/p/msysgit/downloads/list 가서 window용 Git 다운

3. Reference 

Git 배우는데 최고봉 -> http://learnbranch.urigit.com/

 http://rogerdudler.github.com/git-guide/index.ko.html 

 http://gitready.com/

 http://www.dreamy.pe.kr/zbxe/CodeClip/95408

 http://blog.outsider.ne.kr/865

 http://gitref.org/index.html

 http://rocksea.tistory.com/entry/github-github-%EC%82%AC%EC%9A%A9%EB%B2%95

 http://www.dreamy.pe.kr/zbxe/CodeClip/95408



git command 

 설명

 git config --list

 config 내용 조회

 git config --global http.proxy http://168.219.61.252:8080

 git proxy를 설정하는 부분(여기참조)이며 ://와 Ip사이에 id@pw로 내용을 입력하여 설정하여 사용 가능

 git config --global color.status auto  콘솔모드에서 글자 하이라이트 설정하는 명령어
 git config --global color.branch auto
 git diff  변경사항들을 diff명령으로 확인하기 
 git log  커밋 히스토리 확인하기
 git commit --amend -m "More changes - now correct"  커밋 메세지 수정하기

 git init

 저장소 만들기

 git clone https://~

 로컬로 받아오기~
 git log 로그를 통해 commit id 찾는다.
 git reset --hard 7c21ab3ea 7c21ab3ea에 해당되는 push 버젼으로 local branch reset를 한다.
 git push origin +master 강제로 conflict를 무시하고 강제로 push 
 git stash stack 구조로 현재 local의 working tree 보관 
 git pop 위에 쌓은걸 꺼내오기


 



git ignore


.gitignore 파일 입력 규칙

- 아무것도 없는 라인이나, #로 시작하는 라인은 무시한다.

- 표준 Glob 패턴을 사용한다.

- 슬래시(/)로 시작하면 하위 디렉토리에 적용되지(Recursivity) 않는다.

- 디렉토리는 슬래시(/)를 끝에 사용하는 것으로 표현한다.

- 느낌표(!)로 시작하는 패턴의 파일은 무시하지 않는다.


#Git bash 명령어 - .gitignore 적용하기


#1. .ignore파일을 작성한다.


#2. 모든 파일을 git index에서 제거 한다.(무시대상 파일 뿐만아니라 전부 index에서 삭제)

git rm -r --cached .


#3. 다시 index에 추가 한다.(이때 무시대상 파일을 제외한 나머지 파일만 추가됨)

git add .


#4. 적절한 메세지와 함께 commit

git commit -m '.gitignore 적용'


#5. 다른 사람과 공유할 준비가 되었다면 push

git push origin [branch_name]




Reference 

http://gitready.com/beginner/2009/01/21/pushing-and-pulling.html



'IT > Tool' 카테고리의 다른 글

PowerShell 익숙해지기.  (0) 2015.03.03
캡쳐부터 자동 웹업로드되는 막강 툴! Cropper!  (0) 2013.03.25
JMeter  (0) 2013.02.26
JMeter - Java Request  (0) 2013.02.18
Posted by 억사마
IT/Tool2013. 3. 25. 11:17

최근에 기술 관련 문의가 많아서 영작에도 어려움을 겪고 그림도 올리려고 하면 일일이 캡쳐하고 그걸 다시 업로드해서 붙여서 이걸 어떻게 하면 간단하게 해결할까? 하는 고민에 stackoverflow를 찾아보니 간단히 해결되는 툴을 찾았다.

Cropper라는 툴인데 플러그인까지 같이 깔면 자동으로 캡쳐도 하고 그걸 웹으로 올려주고 링크를 따주기 때문에 뭔가 그림 첨부할때 상당히 편하다고 볼 수 있다.


우선 Cropper와 확장 플러그인을 받아야한다.

1) Cropper에 가서 Downloads에서 최신 버젼 다운로드

2) Cropper 확장플러그인 사이트 가서 최신 버젼 다운로드

3) 1)번 설치하고 설치폴더하위에 plugins에 2번에서 다운로드한 걸 압축을 풀어 dll파일 추가 (C#으로 만들어진 플러그인이라고 함 dll형식)

(위는 Cropper의 Imgur 플러그인 사용하여 캡쳐해서 Imgur에 업로드하고 링크딴 걸 첨부로 붙였다.)

4) 그다음 실행하면 시스템 트레이콘으로 생기고 실행을 해보자

5) 옵션에 가서 우선 Output을 자신이 원하는 사진업로드사이트 선택하는데 저같은 경우는 Imgur로 선택을 하기로 한다. "Send to Imgur"선택 

(imageStack의 경우는 별도의 인증절차 없이 사용가능하다)


6) Imgur같은 경우 처음에만 인증키 입력을 하라고 나오면 가서 해당 사이트에 회원가입하 인증키를 받아 넣으면 사용가능




'IT > Tool' 카테고리의 다른 글

PowerShell 익숙해지기.  (0) 2015.03.03
Git  (0) 2013.04.01
JMeter  (0) 2013.02.26
JMeter - Java Request  (0) 2013.02.18
Posted by 억사마
IT/Q&A2013. 3. 19. 15:49

I did load test using jmeter.

I used two listener. one is "Response Times Over Time", and the other is "Transaction per Second".  Comparing with two listeners, I confused whether or not i know the meaning of these data is. I thought that the more the tps is higher, the more the response time is shorter. right?

But the result of data is contrary to what i thought.. is it correct?



Posted by 억사마
IT/Tool2013. 2. 26. 19:03

제일 첫 소개는 당연히 JMeter Wiki이다.

JMeter 단축키

JMeter csv 파일 읽어 User(thread)마다 가변 파라메터 셋팅하기 (여기)



그럼 실제로 한번 해보도록 하자.

우선, 아래는 JMeter를 사용한 안전성, 신뢰성, 부하, 기능 테스트를 위한 테스트 구성이다.


그리고 각 테스트에 대한 시나리오는 다음과 같다.

 안전성 테스트

 FailOver 테스트 - Single, Multi node failure시에 데이터 유실 무 검증 

 
 Aging 테스트 - 장시간동안 서버 처리 기능 검증 
 확장성 테스트

 기존 서버 구성에서 서버가 추가될 경우 부하 Rebalancing 기능 검증

 
 부하  테스트

 최대 한계에 대한 임계치를 구하고, 로드 밸런싱 기능의 성능 검증 

 
 기능 테스트

 Infinispan의 기본 기능, 그리고 추가 확장 기능 검증

 


그리고 위 테스트를 위한 환경 셋팅을 위한 변수 인자들은 다음과 같다.

JMeter 

 

Request Paramter

 
  


테스트 결과 보고서를 제공하는 JMeter의 기능 중 사용할 것을 정리했다.

 SplineVisualizer

 데이터 전송량을 그래프로 보여준다.

 View Results Tree

 각 요청건 별로 실제 송수신 데이터 보여준다. 

 Response Time Over Time

 응답시간별로 그래프 보여준다.

 Transaction Throughput vs Threads

 동시접속 사용자수에 따른 전송데이터량 

 Response Times vs Threads

 동시접속자수에 따른 응답시간의 변화 


아래는 추가로 JMeter Plugin 설치를 하여 사용할 수 있는 확장 기능을 정리했다.

 Response Times Disributions 

 x축 - 응답시간 인터벌,  y축 - 각 인터벌간 잡혀있는 샘플의 개수

 Active Threads Over Time Listener

 시간대별 살아있는 스레드의 개수

 Reponse Codes Per Second

 시간대별 Response Code 기록 (오류 발견시 아주 유용할듯 )

 Latencies Over Time

 Load Test시 Latency를 측정하는 그래프인데 별로 안좋은듯 피드백도 없고!

 Server Hits per Second

 Servers Hits 보여주는 그래프

 Bytes Throughput Over Time

 아주 중요한 그래프 (웹소켓 적용될지는 미지수)

 Composite Graph

 여러그래프를 함께 보여주도록 설정 가능



혹시 요청 url의 경우수가 많을 경우, WorkBench의 Http Proxy Server기능을 사용하여 요청 url을 레코딩할수가 있다. 


Thread Group에서의 설정값


아래는 Config Element에 잘 쓰는 놈중의 하나인 Counter 에 대한 설명이다.




아래는 ServerAgent 를 설치하여 cilent에서 서버의 cpu, memory usage 를 표로 보고 있는 그림




마지막으로 JMeter 사용시 주의사항이다.

Threads를 늘리거나 Listener를 많이 넣을 경우 메모리에 부하를 갈 수 있다. 모니터링 시간이 늘어나면 위험부담은 기하급수적으로 늘어나며 Heap 메모리 부족에러부터 다양한 리소스 부족 현상으로 빚어지는 에러로 에이징(장시간 부하)테스트등이 매끄럽게 진행이 되지 못한다.

그래서 해결방법은

리스너를 줄이거나 아니면 memory heap size를 많이 주는 것이다.

아래는 예제

Sometime I tune Jmeter options like:
JVM_ARGS="-Xms1024m -Xmx1024m -XX:+UseParallelGC -Xss1024k -XX:TenuredGenerationSizeIncrement=1m"


또하나는 Listener에 View Results Tree를 사용하지 말자!!! 기능테스트에서 사용하되, 부하테스트에서는 리소스가 없어 클라이언트가 먼저 리소스 다 잡아먹고 다운되버린다.

아래는 메뉴얼쪽 경고사항

18.3.6 View Results Tree

View Results Tree MUST NOT BE USED during load test as it consumes a lot of resources (memory and CPU). Use it only for either functional testing or during Test Plan debugging and Validation.



> Trouble Shoointg

테스트 중간에 Thread 개수가 많게 하여 테스트를 할 경우 Thread 개수가 증가하다가 나중에 그 개수가 점점 줄어들며 0으로 바뀌고 테스트가 종료가 되어야 

정확한 집계가 되는데 다음과 같이 Thread가 종료가 안되서 정확한 테스트 수치를 획득을 못할 경우가 있다. 

Q) i am running 100 threads concurrently for 5 mins using Jmeter 2.7 on website, once the execution duration is complete, it has to close all the running threads one by one and stop the execution completely, but Jmeter is left with few more threads(around 10-20 threads) without closing..

A)  

가능성 1 : those threads are still waiting on a response from the server

가능성 2 : This issue usually occurs when the requests to the application under test got high response times. The threads will be waiting for the pending response even after the specfied duration is elapsed. This can be avoided to an extent by allowing sufficient thread ramp down time or shut down time. Use Stepping thread group or ultimate thread group( these are JMeter plugins) to give an inclined ramp down instead of sudden shutdown as in normal thread group







Reference

1 : http://www.javaworld.com/javaworld/jw-07-2005/jw-0711-jmeter.html?page=1

2.  http://nico.vahlas.eu/2010/03/30/some-thoughts-on-stress-testing-web-applications-with-jmeter-part-2/

'IT > Tool' 카테고리의 다른 글

PowerShell 익숙해지기.  (0) 2015.03.03
Git  (0) 2013.04.01
캡쳐부터 자동 웹업로드되는 막강 툴! Cropper!  (0) 2013.03.25
JMeter - Java Request  (0) 2013.02.18
Posted by 억사마
IT/후기2013. 2. 23. 17:40

참가 세션 정리

- Open Source Engineering ( 지각으로 아예 참석 못함 )

- 낙타가 PaaS로 간 까닭은? (Camel로 클라우드, SNS묶기) & Hadoop 어플리케이션 테스트하기 : RedHot에서 OpenShift 광고 얘기가 주류를 이루었다. 초반에 Camel로 해서 간단한 샘플 보여주는 정도 때문에 흥미가 갈려고 했는데,, 스킵하고 Hadoop Project 테스트하는 것, 나중에 Hadoop접할때 한번 try해보면 좋다고 추천( template-map-reduce ) ( 예제 )

- Server Side Development : 연사가 조대협이라는 분인데 유명하신분인듯, 사람이 꽤 많이 모였다. 서버 사이드 아키텍쳐에 대해 설명 해주고, 현재 클라우드 컴퓨팅, IaaS로 바뀌어지는 것에 대한 과도기 설명, 전반적인 서버 구성에 대해 설명듣기 좋은 시간이었다. 그 분 블로그에 좋은 자료가 많으니 참고하도록,,

- 클라우스 서버를 활용한 서비스 개발 실습( KT Cloud BIz에 서비스 계정 얻고 APM 환경 설치하여 WordPress 설치하는 것 까지 ) ( 실습 동영상 )  (강사분 블로그)실습 스크립트 공유하는데 구글 오피스 엑셀 공유해서 쓰는데 정말 빠르더라 50명정도의 사람이 동시에 쓰는데도 정말 실시간으로 표시됨-


'IT > 후기' 카테고리의 다른 글

PyconKR 2016 정리  (0) 2016.08.16
Polyglot Programming  (0) 2015.03.13
Posted by 억사마
IT/오픈소스2013. 2. 19. 11:07

현재 수행하고 있는 프로젝트에 임의의 테이블을 만들고 데이터를 300만건을 만들려고 한다. 물론 의미있는 데이터 필요는 없지만 구색은 맞추었으면 한다. 이걸 엑셀과 VBA 사용해서 만들어볼까하다가 구글링을 혹시나 해보았다. 그런데 Data Generate 해주는 툴이 있는게 아닌가,,

이름하여, Databene Benerator이다. 

아주 오래전에 올라온 오픈소스인데 아직 버젼이 1.0 찍지는 못하였으나 리뷰를 보면 알다시피, 아는 사람은 계속 가지고 잘 사용하고 있다는 것을- 그리고 왠만한 데이터베이스와 호환이 된다. (내가 아는 데이터베이스가 많이 없어서 그럴수도 있다.)

사용법은 메뉴얼을 보면 머리가 보면 너무 복잡해지고 알아될 그 프로그램만의 용어, 그리고 개념, 구조 등등 알아야 될게 많으니 간단히 설명을 하자.


우선, 준비는 다음과 같다.

1. 여기에서 다운로드를 받자. 참고로 최신 0.97버젼인데 독일회사인지로 바꼈다. 우선 txt로 된 파일을 받아 url의 주소를 가서 받도록 하자. (0.80 버젼은 아래에서 받자)

benerator-0.8.0.a01

benerator-0.8.0.a00

benerator-0.8.0.alz


2. 압축을 폴면 bin 폴더가 있고, demo 폴더가 있다. 두개 폴더만 보면 된다. 괜히 머리아프게 딴거 보지말자. bin은 실행, 환경설정 파일이 있는거고, demo는 이 프로그램을 쓰기 위한 예제가 있다. 셋팅할게 많으니 빠른 이해와 급적용 위해서는 예제 필수 ( 필자도 그리했슴 )

3. bin폴더는 classpath를 잡아줘서 어디서든 bin\benerator 명령이 먹히도록 하자. ( 한번 쓰고 말꺼면 몰라도)

위와 같이 shop폴더를 예제를 삼은 것은 이것만 보면 다른건 다 이해가 간다. 그리고 예제 업데이트가 안되서 다른 예제는 오류가 나는 경우가 있다. deprecated된것도 아니고 아예 기능을 뺀게 있어 xml 파싱을 하다가 나는 오류가 있으니 참고 필수임돠~

설명은 h2 database 기준으로 설명을 하겠어요.  

메인이 shop.ben.xml 파일이다. 이 xml을 가지고 실제 benerator가 작업을 다하기 때문에 이 xml 구조만 설명하면 거의 아신다고 해도 무방~

위치는  BENERATOR_HOME\demo\shop\shop.ben.xml 에 있으며, 주요 태그들의 설명은 다음과 같습니다.

 exectue

 attribute의 sql문을 직접 실행시키며, create,drop DDL문을 실행시켜 셋팅작업을 하는데 사용한다.

 setup

 root태그, xsi, xsd설정, 그대로 유지

 comment  말그대로 주석태그

 import

 domains, platforms를 import

 setting

 properties 설정

 include

 property files loading

 iterate

 file에서 data들을 읽어서 consumer에 저장 

 generate

 data 생성하는 부분

 id : column name  generator : data generation func지정

 reference : FK임을 지정 targetType(Fk 관계 있는대상 테이블)

 attribute : type별 특정 값 random 추출

 consumer : 해당 데이터를 fixed length등의 포멧지정으로 외부로 export

세부 설명은 PDF(여기)를 참조하도록 한다.


하나 예를 들면, 아래 예제에서 generate 태그 propety에 count는 생성할 데이터 건수를 3백만건으로 변경하고 싶으면 아래 소스중에 db_product를 generate하는 부분에 

count 태그의 값을 3000000으로 변경하면 3백만건의 데이터가 생성이 된다.


....

실행방법은

BENERATOR_HOME\bin\benerator.bat 해당경로의 shop.ben.xml 을 참조하면 되는데 이해를 돕기 위해서 execute.xml을 제가 따로 만들었습니다.


................

<?xml version="1.0" encoding="iso-8859-1"?>

<setup 

xmlns="http://databene.org/benerator/0.7.0"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://databene.org/benerator/0.7.0 http://databene.org/benerator-0.7.0.xsd">

 

 

<!-- 도메인 정의는 생략하기로 함 -->

<!-- <import domains   = "person,net,product" /> -->

<import platforms = "db"/>

<setting name="database" default="oracle" />

<setting name="dbCatalog"  default="" />  <!-- db catalog -->

<setting name="dbSchema"   default="" />     <!-- db schema -->

<setting name="dbPassword" default="manager" />  <!-- db password -->

<setting name="dbBatch"    default="false" />  <!-- db batch -->

<setting name="row_count"    default="3000" />   <!-- db 생성할 row 카운트  -->

<!--<setting name="stage" default="development" /> --> <!-- 생략 가능  -->


<comment>import stage and database specific properties</comment>

<include uri="{ftl:${database}/shop.${database}.properties}" /> 

<!-- ftl: is the prefix used for scripting with FreeMarker Template Language -->

<!--  <include uri="{ftl:shop.${stage}.properties}" /> -->


<!--  TODO use environment file -->

    <comment>define a database that will be referred by the id 'db' subsequently</comment>

    <database id="db" url="{dbUrl}" driver="{dbDriver}" catalog="{dbCatalog}" schema="{dbSchema}"

        user="{dbUser}" password="{dbPassword}" batch="{dbBatch}" />


<!--

<comment>drop the current tables/sequences if they exist and recreate them</comment>

<execute uri="{ftl:${database}/drop_tables.${database}.sql}"   target="db" onError="ignore" /> 

<execute uri="{ftl:${database}/create_tables.${database}.sql}" target="db" />

-->


<!-- ID GENERATOR 정의 -->

<bean id="idGen" spec="new IncrementGenerator(1000)" />

<bean id="idGen1" spec="new IncrementGenerator(1)" />

<bean id="idGen2" spec="new IncrementGenerator(1)" />



<comment>Creating a valid base data set for regression testing by importing a DbUnit file</comment>

<!--<iterate source="shop.dbunit.xml" consumer="db" />-->


<!--csv -->

<comment>Importing some more predefined products from a CSV file</comment>

<!--<iterate source="products.import.csv" type="db_product" encoding="utf-8" consumer="db" /> -->

<bean id="sg" class="SequenceTableGenerator">

<property name="database" ref="db"/>

<property name="table" value="SDM_DOCUMENT"/>

<property name="column" value="DOC_ID"/>

</bean>

 

<!-- generate -->

<generate type="SDM_DOCUMENT" count="{row_count}" consumer="db">

<id name="pjt_code" type="string" generator="new IncrementalIdGenerator(10000)" />

<id name="doc_id" type="string" generator="idGen" /> 

<attribute name="gepc_type_code" values="'1','2','3', '4'"/>

<attribute name="pbs_level1_code" values="'PM','PMO','PL'"/>

<attribute name="pbs_level2_code" values="'COM','CEE','CEB'"/>

<attribute name="doc_name" values="'Buried Telephone Cable Distribution Wire Installation Details','Standard Installation Telephone Pole Lines'" />

<id name="doc_no" generator="idGen2" />

<attribute name="doc_revision_no" values="'1','2','3', '4', '5'"/>

<attribute name="doc_status_code"  values="'1','2','3', '4', '5'" />

<attribute name="delete_yn" values="'y','n'" />

<attribute name="incharge_id" values="'byunghyun.yu', 'ds.lee', 'e.joe', 'sue.park'"/>

<attribute name="incharge_name" values="'y','n'"/>

<attribute name="security_level" values="'1','2','3', '4', '5'" />

<attribute name="doc_content" values="'aaaaa','bbbbb','cccccc'" />

<attribute name="deliverable_list_name" values="'aaa','bbbb','ccccc'" />

<attribute name="task_pjt_id" values="'13579'" />

<attribute name="task_id" values="'1','2','3','4','5','6','7','8','9','10'" />

<attribute name="create_dttm"  type="date" nullable="false" />

<attribute name="create_id" values="'byunghyun.yu', 'ds.lee', 'e.joe', 'sue.park'" />

<attribute name="update_dttm"  type="date" nullable="false" />

<attribute name="update_id" values="'byunghyun.yu', 'ds.lee', 'e.joe', 'sue.park'" /> 

</generate>

</setup>

................



이렇게 실행을 하면 자동으로 database를 connection하고 지정한 테이블들의 데이터를 자동으로 generate시킵니다.

 

 

*******************************************************************************************************************
 <comment>create order items</comment>
 <generate type="db_order_item"
   count="{customer_count * orders_per_customer * items_per_order}" consumer="db">
  <variable name="product" source="db" selector="select ean_code, price from db_product" distribution="cumulated" />
        <id name="id" generator="idGen" />
  <attribute name="number_of_items" min="1" max="27" distribution="cumulated" />
  <reference name="order_id" source="db" selector="select id from db_order where id &gt; 1" cyclic="true" />
  <reference name="product_ean_code" script="product[0]" />
  <attribute name="total_price" script="product[1] * db_order_item.number_of_items" />
 </generate>

 

*******************************************************************************************************************

 

 

'IT > 오픈소스' 카테고리의 다른 글

HornetQ vs ActiveMQ vs RabiitMQ  (0) 2013.04.18
Posted by 억사마