http://docs.locust.io/

http://httpbin.org/

신고

'Open Sources > ETC' 카테고리의 다른 글

locust 관련 정보  (0) 2017.08.25
Kali Linux (칼리 리눅스)  (0) 2016.10.11
Vagrant  (0) 2016.07.20
Slack  (0) 2016.07.11
Libre Plan  (0) 2016.07.11
SonarQube  (0) 2016.02.03

Download

https://www.kali.org/downloads/

Definition

Kali Linux is a Debian-based Linux distribution aimed at advanced Penetration Testing and Security Auditing. Kali contains several hundred tools aimed at various information security tasks, such as  Penetration Testing, Forensics and Reverse Engineering. Kali Linux is developed, funded and maintained by Offensive Security, a leading information security training company.

신고

'Open Sources > ETC' 카테고리의 다른 글

locust 관련 정보  (0) 2017.08.25
Kali Linux (칼리 리눅스)  (0) 2016.10.11
Vagrant  (0) 2016.07.20
Slack  (0) 2016.07.11
Libre Plan  (0) 2016.07.11
SonarQube  (0) 2016.02.03

Vagrant는 가상화 기술을 쓰기 편하도록 하여 개발 환경을 손쉽게 구축해주는 도구이다. Vagrant를 이용하면 다양한 개발 및 테스트 환경을 빠르게 구축할 수 있으므로 다양한 개발 환경에서 테스트를 진행하거나 또는 기존에 구축했던 시스템의 환경을 재현하는데 큰 도움을 얻을 수 있다.

Vagrant를 이용하여 우리가 얻을 수 있는 이점은 다음과 같다.

  • 과거 구축했던 개발 및 운영 환경을 즉시 재현할 수 있다.
  • 개발자가 만든 VM 이미지를 다른 개발자들과 공유할 수 있다.
  • VM 구성 및 배포를 커맨드 몇 번만으로 빠르게 진행할 수 있다.
  • 개발자가 구성한 VM을 서버에서도 그대로 사용할 수 있다.
  • VM 공유 기능을 제공한다.
  • 설치가 매우 쉽다.
  • 소프트웨어 구성 비용이 없다.
  • 유지보수 비용을 최소화할 수 있다.

간편함이 있는 반면이 단점도 있다.

  • OpenStack과 같은 Cloud IaaS를 구성하지는 않는다(Network, Storage, Compute 가상화를 포함한 가상화 기술을 제공하지는 않음)
  • 잘 만들어진 웹 UI를 제공하지 않는다.
  • VMWare를 기반으로 사용하려면 유료 플러그인을 구매해야 한다(10만원 이하).

만약 네트워크 가상화와 스토리지 가상화 등등 복잡한 Cloud IaaS 환경을 지원해야 한다면 OpenStack이 정답이나 OpenStack은 설치도 어렵고 설치 이후에 발생하는 다양한 이슈를 엔지니어가 직접 해결을 해야 하기 때문에 유지보수 비용이 상당히 증가하므로 단순한 서버 가상화 정도 수준에서 사용한다면 Vagrant + Virtualbox 조합 또는 KVM과 같은 Hypervisor와 관리 도구를 같이 사용할 것을 권장한다.

Reference : http://wiki.opencloudengine.org/pages/viewpage.action?pageId=2852295

신고

'Open Sources > ETC' 카테고리의 다른 글

locust 관련 정보  (0) 2017.08.25
Kali Linux (칼리 리눅스)  (0) 2016.10.11
Vagrant  (0) 2016.07.20
Slack  (0) 2016.07.11
Libre Plan  (0) 2016.07.11
SonarQube  (0) 2016.02.03

Introduce

2013년 샌프란시스코에서 설립된 메시지 기반 협업 서비스.

PC와 모바일 버전의 Slack을 사용하면 언제 어디서나 팀원과 소통은 물론 효율적으로 업무를 진행할 수 있다.

Pricing

ModelPrice

Description

FreeFree
  • Search and browse 10k
    most recent messages
  • 10 service integrations
  • Free native apps for iOS, Android, Mac & Windows Desktop
  • Multi-team Support
  • 1:1 calls (beta)
Standard$8
  • Searchable archive with unlimited messages
  • Unlimited service integrations
  • Custom retention policies
  • Guest access
  • Priority support
  • Google Authentication (OAuth) / Google Apps for Domains sign-on
  • Configurable email ingestion service
  • Mandatory two-factor authentication
  • User Groups
  • Group calls (beta)
Plus$15
  • SAML-based single sign-on (SSO)
  • Compliance Exports of all message history
  • Support for external message and archival solutions
  • 99.99% guaranteed uptime SLA
  • 24/7 support with 4 hour response time
  • User provisioning and deprovisioning
  • Real-time active directory sync with OneLogin, Okta & Ping
EnterpriseCOMING SOON
  • Federation across multiple teams with a unified team directory
  • Unified security, data retention and compliance policies across all federated teams
  • Organization-wide reporting, metrics & analytics
  • Consolidated billing & administration across teams


신고

'Open Sources > ETC' 카테고리의 다른 글

Kali Linux (칼리 리눅스)  (0) 2016.10.11
Vagrant  (0) 2016.07.20
Slack  (0) 2016.07.11
Libre Plan  (0) 2016.07.11
SonarQube  (0) 2016.02.03
업무 관리 도구 - 트렐로(Trello)  (0) 2014.07.12

http://www.libreplan.org/home/

Installation

sudo add-apt-repository ppa:libreplan/ppa
sudo apt-get update
sudo apt-get install libreplan

http://localhost:8080/libreplan/

Display

신고

'Open Sources > ETC' 카테고리의 다른 글

Vagrant  (0) 2016.07.20
Slack  (0) 2016.07.11
Libre Plan  (0) 2016.07.11
SonarQube  (0) 2016.02.03
업무 관리 도구 - 트렐로(Trello)  (0) 2014.07.12
Datagenerator - dbMonster Data Type  (0) 2013.03.05

URL : http://www.sonarqube.org/

소프트웨어 개발은 크게 기능과 비기능 요건을 충족하도록 구현하는 대전제가 있는데, 왜냐하면 이 두가지 모두를 충족하지 못하면 어떤 형태로든 문제가 발생되기 때문이다. 기능은 충족했지만, 성능, 보안, 확장성, 변화가능성 등의 수많은 비기능 요건을 충족하지 못해서 결국 재작업이라는 추가 비용이 발생되는 경우도 많이 있다.

비기능 요건이 기능 요건에 비해서 다루기 어려운 이유는 기능 요건에 대해서는 고객과 충분히 협의나 협상이 가능하여 범위 조정할 수도 있지만, 비기능 요건에 대해서는 기본적인 베이스라인이 충족해야만 해당 기능 요건을 실행할 수 있는 토대를 마련할 수 있기 때문에 고객과의 협의나 협상 대상의 폭이 그리 크지 않다는 것이다. 실행되지 않은 소프트웨어에 대해 비용을 지불하고 구매하려는 고객은 없을 것이기 때문이다.

기능 요건들은 개발을 통해 고객에게 충분히 가시적으로 보여주는 영역이 있는 반면에, 비기능 요건에 대해서는 가시적으로 보여줄 수 있는 범위가 제한적이고 이 역시 별도의 비용이 발생될 수 밖에 없다. 특히, 소프트웨어 구축 비용 산정에 있어서 이러한 비기능 요건들에 대해서는 대부분이 비중있게 고려하지 않고 있는 상태라 비기능 요건을 충족시키려고 프로젝트 기간 동안 충분한 시간과 비용을 투여하기란 여간해서 쉽지가 않다.

SonarQube는 이와 같은 상황에서 프로젝트에 적용한다면 적은 시간과 비용으로 비기능 요건에 대한 가시화를 충분히 충족시킬 수 있는 도구임에 틀림없다. 물론, 그러한 가시화를 통해서 비기능 요건들을 충족시키려는 노력은 별도로 수반되어야 한다.


사용방법

SonarQube는 www.sonarqube.org에서 다운로드 받을 수 있으며, 실행을 위해서는 tomcat과 같은 웹 애플리케이션 서버와 MySQL이나 오라클 같은 데이터베이스가 우선 필요하다. 물론, 독자적인 실행도 가능하지만, SonarQube에서 여러 시스템들을 같이 관리할 수도 있고 장기적으로 사용하려면 별도의 독자적인 서버를 마련해서 실행하는게 낫다.

SonarQube는 크게 SonarQube와 SonarQube Runner로 나뉘어져 있으며, SonarQube는 웹 애플리케이션 서버 내에서 실행하는 war로 구성되어 있다. SonarQube는 대상 소스를 분석한 결과를 보여주는 웹화면들로 구성되어 있으며, SonarQube Runner는 대상 소스를 분석하는 명령어가 있다. 형상관리 도구로부터 소스를 가지고 와서 소스를 분석 후, SonarQube를 통해 결과를 DB에 저장하고 이를 SonarQube를 통해 보는 방식이다.


SonarQube 디렉토리 구조

[그림 1] SonarQube 디렉토리 구조


그림 1은 SonarQube의 디렉토리 구조이며, WAS의 구조와 거의 유사하다. 즉, war 디렉토리 하위에 있는 war 파일을 tomcat과 같은 별도의 서버에 복사해서 실행이 가능하다. 다만, DB 설정과 같은 내용들은 SonarQube 디렉토리 하위에 conf/sonar.properties를 통해서 설정해야 하고, SONARQUBE_HOME을 환경변수로 설정해야 한다. (참고 : SonarQube 설치)

SonarQube Runner는 실행 명령어(bin/sonar-runner)가 위치하고 있으며, 이를 통해서 소스 분석이 가능하다.

CI(Continuous Integration) 도구와의 연결

SonarQube는 Jenkins와 같은 CI 도구를 통해서 연결이 가능하다. 이를 위해서는 Jenkins Sonar Plugin을 설치하고, 해당 CI 작업 절차 중에 Post-build Actions에 Sonar 내용을 설정해주면 된다.

Jenkins Sonar Plugin을 설치하면 Configuration에 Sonar와 연결하는 내용을 입력하는 부분이 그림 2와 같이 나타난다.


[그림 2] Jenkins와 SonarQube 연결 설정



[그림 3] Jenkins의 작업에서 SonarQube 플러그인 내용 설정

물론, Maven 프로젝트를 통해서 Jenkins는 실행해야 하며, pom.xml 에도 이를 연결하는 설정이 필요하다. CI를 통해서 SonarQube를 연결할 때에는 해당 작업을 실제 배포 작업과는 별도로 만들고, SonarQube 작업이 다 끝난 뒤에 배포 작업을 수행하도록 연결하는게 좋다. 분석하려는 대상 소스의 양이 많을수록 시간이 걸리며, SonarQube를 통해서 품질 문제를 모두 통과했다면 실제 배포는 단순한 빌드/컴파일만 수행하고 작업을 끝내는 것이 낫다. (빌드 작업에 대한 내용 참조 : http://homo-ware.tistory.com/206)

Jenkins와 SonarQube를 연결할 때에는 테스트 실행이 양쪽 모두 수행할 수 있기 때문에 Jenkins에서는 –DskipTests 옵션을 통해 빌드만 수행하고 SonarQube에서 테스트를 수행하도록 조절하는 것도 시간을 절약하는 방법이기도 하다.



[그림 4] Maven의 pom.xml에 sonar 플러그인 설정


SonarQube 사용하기

SonarQube는 품질에 관련된 수많은 플러그인들이 존재하며, 분석시 이러한 플러그인들을 언제든지 추가하여 새로운 지표를 측정해볼 수 있다. 플러그인은 Update Center에서 온라인을 통해 설치할 수도 있지만, 인터넷 연결이 불가한 경우에는 SONARQUBE_HOME/extensions/plugins 디렉토리에 해당 jar만 올리면 된다.

최근에 SonarQube가 많이 사용되면서 언어로는 Android를 비롯해서 Scala까지 플러그인 개발이 진행되고 있으며, Fortify나 Google Analytics와 같은 플러그인들도 공개버전으로 제공되고 있다. 즉, SonarQube 하나만으로 다양한 품질을 측정할 수 있는 종합 선물 세트와 같은 느낌을 받는다.



[그림 5] SonarQube 플러그인 라이브러리들


SonarQube를 통해 분석할 수 있는 언어는 Java를 포함해서 20여가지가 된다. 하지만, SonarQube의 단점은 하나의 작업에 하나의 언어만을 분석할 수 있기 때문에 Java와 JavaScript, Web, XML과 같이 섞여 있는 소스 코드를 한꺼번에 분석할 수는 없다. 즉, 동일 소스를 대상으로 해당 언어 만큼 작업을 실행해야 한다. SonarQube의 플러그인이 가장 많은 것은 물론 Java이며 플러그인 별로 실행이 가능한 SonarQube 버전을 살펴봐야 한다. 플러그인은 상용도 있으며, 사용자가 만든 것도 얼마든지 확장 가능하다.


모든 것을 한눈에 보여주는 Dashboard 기능

SonarQube의 가장 뛰어난 기능이라면 단연 Dashboard를 들 수 있다. 사용자가 Dashboard 내용 편집이 가능하고, 플러그인에서 제공되는 화면에 대한 설정이 얼마든지 가능하다. 특히, 여러가지 지표들을 종합하여 하나의 측정치를 보여주는 플러그인들도 있다. Technical Debt와 같은 플러그인의 경우에는 실제로 빚을 액수(달러)로 표현해주고 있다. 그림 6에서는 약 20만 라인의 소스가 60만 달러의 빚을 지고 있는 것으로 산출되고 있다. (빚은 상대적인 수치로 보는 것이 좋다. 실제로 60만 달러는 정말 좋은 수치에 포함된다.)


knowhow_img2-6

[그림 6] SonarQube의 Dashboard


Dashboard를 통해서 상세한 내용을 볼 수 있으며, 관련 소스를 더욱 자세하게 분석이 가능하다. SonarQube가 Dashboard를 통해서 보여주는 내용은 소위 품질의 7가지 축(seven axes of quality)이라고 하는 ‘잠재적인 버그’, ‘코딩 규칙’, ‘테스트’, ‘중복’, ‘주석’, ‘아키텍처 및 설계’, ‘복잡도’에 관련된 내용이다.

‘코딩 규칙’은 설정 부분에서 언어에 따라서 지정할 수가 있으며, Java의 경우에는 FindBugs와 같은 좀더 강력한 규칙을 적용해볼 수도 있다.



[그림 7] 특정 소스에 대한 다양한 분석 결과들


‘테스트’는 분석 대상 소스에 단위테스트가 있어야 하며, 커버리지를 통해 분석할 수 있다. ‘주석’이나 ‘중복’은 ‘주석’의 비율이 높으면 높을수록 좋고, ‘중복’은 비율이 적으면 적을수록 좋다. 이와 같이 서로 대비될 수 있는 지표들을 비교함으로써 소스코드에 대한 품질을 다양한 각도에서 분석해볼 수 있다.


여러 프로젝트 간의 비교


[그림 8] SonarQube의 Treemap을 통한 각 프로젝트 간 비교


Treemap에서 Size를 다양하게 변경함으로써 사각형의 크기가 이에 따라서 바뀌고, Color를 통해서 기준값을 변경함으로써 어떤 프로젝트가 얼마만큼의 크기로 어느 정도의 안정성을 가지는지를 비교해볼 수 있다. 예를 들어, Size에 LoC를 선택하고, Color를 Rules Compliance를 선택하면(그림 8) 사각형이 클수록 소스량이 많고, 색깔이 붉을수록 코딩 규칙을 위배하는 내용이 많게 된다.

SonarQube 플러그인 중에는 소스코드의 영향도 파악을 위해 Doxygen 플러그인을 통해서 해당 소스를 호출하고 있는 다른 소스를 분석할 수 있는데, 이를 설치하기 위해서는 graphviz라는 서버에서 이미지를 생성하는 라이브러리 설치가 필요하다. 다만, Doxygen은 정적 분석에 의존하기 때문에 인터페이스와 구현클래스와의 연결까지 분석해주지는 않는다.

사실 영향도 분석은 모든 소프트웨어에서 가장 분석하기 어려운 부분이기도 하다. 특히 시스템을 넘어서 재사용하는 모듈들에 대해서는 단순히 정적 소스 코드 분석만으로 모든 영향도 분석에 한계가 있다. 상용으로 영향도 분석 도구를 구매했다고 하더라도 각 시스템의 아키텍처나 내부 설계 구조에 따라서 영향도 분석 내용을 커스터마이징해야 하는 경우도 분명 발생한다. 또한, 정적 소스 코드 분석의 한계가 있기 때문에 영향도 분석에서 아주 세세한 부분까지 파악하기는 힘들다.


[그림 9] Doxygen 플러그인을 통해 분석한 소스 call graph



온라인 코드 리뷰 협업

코드 리뷰를 수행하면 분명 코드의 품질은 높아지게 된다. 아무리 잘 짜여진 코드라고 하더라도 타인의 관점에서 해당 코드를 들여다보면 문제점이 발견되고는 하는데, SonarQube에서는 이를 온라인으로 수행할 수 있게끔 해준다.


[그림 10] SonarQube의 코드 리뷰 기능


특정 소스에서 문제가 발생된 지점은 코멘트를 적거나 해당 부분을 특정인에게 할당이 가능하다. 혹은 문제가 없더라도 해당 소스 영역에서 의견을 개진할 수 있으며, 이 부분 역시 리뷰 절차를 수행할 수 있다.

이러한 코드 리뷰들은 이슈 절차에 따라서 모두 집계되고 실질적으로 코드 상의 이슈를 중점적으로 관리할 수 있도록 한다. 물론, 이러한 이슈들은 Jira와 같은 도구와 연결할 수 있는 플러그인을 같이 사용하여 더욱 효과적으로 관리할 수도 있다.


Eclipse SonarQube 플러그인

IDE 도구인 Eclipse 역시 SonarQube 플러그인을 제공하고 있으며, 해당 프로젝트 선택시 관련 SonarQube 화면이 나타난다.


[그림 11] Eclipse의 SonarQube 플러그인을 통한 연결


독립적인 SonarQube 실행

SonarQube를 CI와 연결하지 않고, 소스 코드가 로컬이나 형상관리 도구에 위치하고 있다면, SonarQube Runner를 통해서 실행하면 되는데, 이 경우에는 소스나 컴파일된 바이너리의 위치를 지정하는게 필요하다. 이러한 설정을 –Dproject.settings 를 통해서 지정할 수 있다.



[그림 12] 독립적인 실행을 위한 설정 및 실행 스크립트


개발에 부담이 아닌 도움을 주는 품질 가시화

비기능 요건인 소프트웨어 품질은 많은 부분에 있어서 개발에 대한 부담으로 작용하는게 사실이다. 소스 코드의 분량이 늘어나면 늘어날수록 품질은 그만큼 더 안좋아지게 마련이며, 이를 위해서는 늘어나는 소스 코드 만큼 품질 활동이 뒷받침되어야 변경 이전의 상태 수준으로 맞출 수 있다. (소프트웨어의 회귀 성질이며, 이를 극복하는 방법 중에 하나가 회귀시험이다) 늘어나는 소스 코드 만큼 품질 활동을 SonarQube가 대신해주고, 그에 대한 개선 활동을 지속적으로 수행한다면 늘 일정 수준의 소프트웨어가 유지될 것이다.

지속적인 통합(CI, Continuous Integration)에는 꾸준한 속도로 소스 코드가 증가됨을 의미하며, 그에 맞게 품질 역시 지속적으로 개선되어야 함을 의미한다.

 

신고

'Open Sources > ETC' 카테고리의 다른 글

Slack  (0) 2016.07.11
Libre Plan  (0) 2016.07.11
SonarQube  (0) 2016.02.03
업무 관리 도구 - 트렐로(Trello)  (0) 2014.07.12
Datagenerator - dbMonster Data Type  (0) 2013.03.05
Datagenerator - dbMonster Installation Guide  (0) 2013.03.05

창업한 친구에게 들은 업무 관리 도구 Trello

https://trello.com/

이전 회사에서는 업무 관리 도구로 JIRA Plugin인 Green Hopper를 사용하였다.

Green Hopper는 Agile 개발 방법 형태로 업무를 프로젝트 Release  버전 등으로 나눌 수 있으며, JIRA와 연동했을 때, 강력한 기능을 발휘 한다.

그렇지만 상용 Plugin이며, JIRA를 사용하지 않으면, 무용지물이 된다.

간단한 소규모에서 사용할 수 있는 것이 Trello이며, 이는 프로젝트에 참여 인원을 포함 시켜 각각의 업무를 정리하고, 이것을 관리하는 것에 유용하다.

또한 별도의 서버를 필요로 하지 않으며, Web에서 간단한 가입만으로도 사용 가능하다.

Web에 등록, 관리 하는 형식이기 때문에 보안에 민감한 내용을 다룰 때에는 고민을 해야하지 않을까 싶다.

 

 

아직 직접 사용해 보지 않았기 때문에, 자세한 내용은 사용 후, 정리하도록 하겠다!

신고

'Open Sources > ETC' 카테고리의 다른 글

Libre Plan  (0) 2016.07.11
SonarQube  (0) 2016.02.03
업무 관리 도구 - 트렐로(Trello)  (0) 2014.07.12
Datagenerator - dbMonster Data Type  (0) 2013.03.05
Datagenerator - dbMonster Installation Guide  (0) 2013.03.05
Datagenerator - generatedata.com  (0) 2013.03.05

Datagenerator Data Type
String generator
Name : String Generator
Full type name : pl.kernelpanic.dbmonster.generator.StringGenerator
SQL types : char, varchar, text
Description : String generator is used to produce a random string. As a base for generating words it uses an ispell dictionary so the distribution of vowels and consonants is quite similar to english language (although the output text itself is far from that).
Properties
minLength  The minimal length of output string. [default: 0] 
maxLength  The maximul length of output string. The maximum length is limited by the size of Java type of Integer. [default: 255] 
allowSpaces  A boolean value that may be used to cause a StringGenerator not to use any spaces. It is useful for such fields like login or names. [default: true] 
excludeChars  this characters cannot occure in generated string [default: no default value] 
nulls  How many nulls should this generator produce per every 100 generations? [0 - 100, default: 0] 

ex)

<column name="STRINGA" databaseDefault="false">
<generator type="pl.kernelpanic.dbmonster.generator.StringGenerator">
<property name="allowSpaces" value="false"/>
<property name="excludeChars" value=""/>
<property name="maxLength" value="10"/>
<property name="minLength" value="0"/>
<property name="nulls" value="10"/>
</generator>
</column>

 

Boolean generator
Name : Boolean Generator
Full type name : pl.kernelpanic.dbmonster.generator.BooleanGenerator
SQL : types boolean
Description : Returns true, false or null.
Properties
probability  how many of "trues" should this generator produce per every 100 generations? [0 - 100, default: 50] 
nulls  How many nulls should this generator produce per every 100 generations? [0 - 100, default: 0] 

ex)

<column name="BOOLEANA" databaseDefault="false">
<generator type="pl.kernelpanic.dbmonster.generator.BooleanGenerator">
<property name="nulls" value="10"/>
<property name="probability" value="50"/>
</generator>
</column>

 

Constant generator
Name : Constant Generator
Full type name : pl.kernelpanic.dbmonster.generator.ConstantGenerator
SQL : types any convertable from/to string
Description : Returns always the same constant.
Properties
constant  constant value, any value convertable from/to string. Please notice that dbMonster does not this conversion itself but passes this process to JDBC driver. It's up to JDBC driver to deal with this value. [default: null] 

 

DateTime generator
Name : Date/Time Generator
Full type name : pl.kernelpanic.dbmonster.generator.DateTimeGenerator
SQL types : timestamp, date, time
Description : Returns a date, timestamp or time from a range. If you do not give a time zone - the default time zone will be used. The minimal survival date string is yyyy-MM-dd.
Properties
startDate  Start date in format yyyy-MM-dd HH:mm:ss.S Z. [default: I don't know)] 
endDate  End date in format yyyy-MM-dd HH:mm:ss.S Z. [default: I don't know)] 
returnedType  time, date, timestamp. [default: date] 
nulls  How many nulls should this generator produce per every 100 generations? [0 - 100, default: 0] 

ex)

<column name="TIMESTAMPA" databaseDefault="false">
<generator type="pl.kernelpanic.dbmonster.generator.DateTimeGenerator">
<property name="startDate" value="2011-12-31 19:00:00"/>
<property name="endDate" value="2012-12-31 06:24:13"/>
<property name="nulls" value="10"/>
<property name="returnedType" value="timestamp"/>
</generator>
</column>

 

Number generator
Name : Number Generator
Full type name : pl.kernelpanic.dbmonster.generator.NumberGenerator
SQL types : from short to numeric
Description : Returns random number.
Properties
minValue  minimal value [default: 0] 
maxValue  maximal value [default: 127] 
returnedType  short, integer, long, float, double, numeric [default: short] 
scale  number of fraction digits [default: 0 ] 
nulls  How many nulls should this generator produce per every 100 generations? [0 - 100, default: 0] 

ex)

<column name="INTA" databaseDefault="false">
<generator type="pl.kernelpanic.dbmonster.generator.NumberGenerator">
<property name="maxValue" value="214748364"/>
<property name="minValue" value="100"/>
<property name="nulls" value="10"/>
<property name="returnedType" value="integer"/>
<property name="scale" value="0"/>
</generator>
</column>

 

Null generator
Name : Null Generator
Full type name : pl.kernelpanic.dbmonster.generator.NullGenerator
SQL types : any
Description :Returns random null

Foreign Key generator
Name : Foreign Key Generator
Full type name : pl.kernelpanic.dbmonster.generator.ForeignKeyGenerator
SQL types : any
Description : Returns value based on a foreign key constraint.
Properties
tableName  Name of the table.
columnName  Name of the column. 

Dictionary generator
Name : Dictionary Generator
Full type name : pl.kernelpanic.dbmonster.generator.DictionaryGenerator
SQL types : any text datatype
Description : Returns value based on a dictionary. A dictionary i a text file containing items. Each row is a new unique item. Dictionary may be compressed using ZIP or GZIP algorithm. Compressed dictionarie's names must contain .zip or .gz suffix otherwise they will be not recognized.
Properties
dictFile  Path to the dictionary relative to the schema file or absolute. 
unique  Should this generator return unique or random value? [default: false] 

 

신고

'Open Sources > ETC' 카테고리의 다른 글

SonarQube  (0) 2016.02.03
업무 관리 도구 - 트렐로(Trello)  (0) 2014.07.12
Datagenerator - dbMonster Data Type  (0) 2013.03.05
Datagenerator - dbMonster Installation Guide  (0) 2013.03.05
Datagenerator - generatedata.com  (0) 2013.03.05
Grinder  (0) 2013.03.05

Installation
PreInstall
JRE or J2SDK, version 1.4.0 or higher,
JDBC driver for your database.
MySQL
dbMonster Download
DBMonster 최신 버전을 Download 한다.
http://sourceforge.net/projects/dbmonster/files/dbmonster-core/
압축을 푼다.

[root@i-10-24-5-10 ~]# tar zxf dbmonster-core-1.0.3.tar.gz

/bin/dbmonster 파일에 실행 권한을 부여한다.

[root@i-10-24-5-10 ~]# cd dbmonster-core-1.0.3/bin
[root@i-10-24-5-10 ~]# chmod 777 dbmonster

DBMonster_HOME 설정
.bash_profile에서 DBMONSTER_HOME을 설정한다.

[root@i-10-24-5-10 ~]# vi ~/.bash_profile
------------------------------------------------------------------
DBMonster_HOME=/root/dbmonster-core-1.0.3
export DBMoster_HOME
-----------------------------------------------------------------

CLASSPATH에 MySQL Connector와 dbMonster Core PATH를 설정한다.

[root@i-10-24-5-10 ~]# vi ~/.bash_profile
------------------------------------------------------------------
CLASSPATH=.:/root/dbmonster-core-1.0.3/mysql-connector-java-5.1.17-bin.jar:/root/dbmonster-core-1.0.3/dbmonster-core-1.0.3.jar
export CLASSPATH
-----------------------------------------------------------------
[root@i-10-24-5-10 ~]# source ~/.bash_profile

 

User Guide
 해당 Tool은 DB에 Data를 Insert 하기 위해 사용한다. 그러므로 DB에 Data를 Insert 하는 방법 위주로 Guide 한다.

Table 생성
설치된 MySQL에 DB와 Table을 생성한다.

mysql> create database TestDB;
mysql> use TestDB;
Database changed
mysql >
CREATE TABLE `TestTable` (
`id` mediumint(8) unsigned NOT NULL auto_increment,
`IN_CTN` varchar(100) default NULL,
`OUT_CTN` varchar(100) default NULL,
`IN_CELL` mediumint default NULL,
`OUT_CELL` mediumint default NULL,
`START_TIME` varchar(100) default NULL,
`CALL_TIME` mediumint default NULL,
`END_TIME` varchar(100) default NULL,
`CLOSE_TYPE` varchar(255) default NULL,
PRIMARY KEY (`id`)
) AUTO_INCREMENT=1;mysql> show tables;
+------------------+
| Tables_in_TestDB |
+------------------+
| TestTable |
+------------------+
1 row in set (0.00 sec)

dbmonster.properties 생성
dbmonster.properties 파일을 생성한 뒤 아래와 같이 DB 정보를 입력한다.

dbmonster.jdbc.driver=com.mysql.jdbc.Driver
dbmonster.jdbc.url=jdbc:mysql://localhost:3306/TestDB
dbmonster.jdbc.username=root
dbmonster.jdbc.password=

Schema 생성
기본 Schema.xml 파일를 생성한다.

[root@i-10-24-5-10 dbmonster-core-1.0.3]# ./bin/dbmonster -c dbmonster.properties --grab -o testTable-schema.xml
Setting DBMONSTER_HOME to: ./bin/..
Setting JAVA_HOME to: /usr/bin/
2012-10-23 21:53:06,093 INFO SchemaGrabber - Grabbing schema from database. 1 tables to grab.
2012-10-23 21:53:06,188 INFO SchemaGrabber - Grabbing table TestTable. 100% done.
2012-10-23 21:53:06,188 INFO SchemaGrabber - Grabbing schema from database complete.

위의 명령어 수행 시에 Schema.xml 파일이 생성되었는지 확인한다.

[root@i-10-24-5-10 dbmonster-core-1.0.3]# ls

 

Schema를 열어서 내용을 확인한다.

<?xml version="1.0"?>
<!DOCTYPE dbmonster-schema PUBLIC "-//kernelpanic.pl//DBMonster Database Schema DTD 1.1//EN" "http://dbmonster.kernelpanic.pl/dtd/dbmonster-schema-1.1.dtd">
<dbmonster-schema>
<name>Change me!</name>
<table name="TestTable" rows="1000">
<key databaseDefault="false">
<generator type="pl.kernelpanic.dbmonster.generator.MaxKeyGenerator">
<property name="columnName" value="id"/>
</generator>
</key>
<column name="IN_CTN" databaseDefault="false">
<generator type="pl.kernelpanic.dbmonster.generator.StringGenerator">
<property name="allowSpaces" value="true"/>
<property name="excludeChars" value=""/>
<property name="maxLength" value="100"/>
<property name="minLength" value="0"/>
<property name="nulls" value="10"/>
</generator>
</column>
<column name="OUT_CTN" databaseDefault="false">
<generator type="pl.kernelpanic.dbmonster.generator.StringGenerator">
<property name="allowSpaces" value="true"/>
<property name="excludeChars" value=""/>
<property name="maxLength" value="100"/>
<property name="minLength" value="0"/>
<property name="nulls" value="10"/>
</generator>
</column>
<column name="IN_CELL" databaseDefault="false">
<generator type="pl.kernelpanic.dbmonster.generator.NumberGenerator">
<property name="maxValue" value="127"/>
<property name="minValue" value="0"/>
<property name="nulls" value="10"/>
<property name="returnedType" value="integer"/>
<property name="scale" value="0"/>
</generator>
</column>
<column name="OUT_CELL" databaseDefault="false">
<generator type="pl.kernelpanic.dbmonster.generator.NumberGenerator">
<property name="maxValue" value="127"/>
<property name="minValue" value="0"/>
<property name="nulls" value="10"/>
<property name="returnedType" value="integer"/>
<property name="scale" value="0"/>
</generator>
</column>
<column name="START_TIME" databaseDefault="false">
<generator type="pl.kernelpanic.dbmonster.generator.StringGenerator">
<property name="allowSpaces" value="true"/>
<property name="excludeChars" value=""/>
<property name="maxLength" value="100"/>
<property name="minLength" value="0"/>
<property name="nulls" value="10"/>
</generator>
</column>
<column name="CALL_TIME" databaseDefault="false">
<generator type="pl.kernelpanic.dbmonster.generator.NumberGenerator">
<property name="maxValue" value="127"/>
<property name="minValue" value="0"/>
<property name="nulls" value="10"/>
<property name="returnedType" value="integer"/>
<property name="scale" value="0"/>
</generator>
</column>
<column name="END_TIME" databaseDefault="false">
<generator type="pl.kernelpanic.dbmonster.generator.StringGenerator">
<property name="allowSpaces" value="true"/>
<property name="excludeChars" value=""/>
<property name="maxLength" value="100"/>
<property name="minLength" value="0"/>
<property name="nulls" value="10"/>
</generator>
</column>
<column name="CLOSE_TYPE" databaseDefault="false">
<generator type="pl.kernelpanic.dbmonster.generator.StringGenerator">
<property name="allowSpaces" value="true"/>
<property name="excludeChars" value=""/>
<property name="maxLength" value="255"/>
<property name="minLength" value="0"/>
<property name="nulls" value="10"/>
</generator>
</column>
</table>

Schema.xml 파일을 원하는 형식에 맞게 수정한다.

<?xml version="1.0"?>
<!DOCTYPE dbmonster-schema PUBLIC "-//kernelpanic.pl//DBMonster Database Schema DTD 1.1//EN" "http://dbmonster.kernelpanic.pl/dtd/dbmonster-schema-1.1.dtd">
<dbmonster-schema>
<name>Change me!</name>
<table name="TestTable" rows="1000">
<key databaseDefault="false">
<generator type="pl.kernelpanic.dbmonster.generator.MaxKeyGenerator">
<property name="columnName" value="id"/>
</generator>
</key>
<column name="IN_CTN" databaseDefault="false">
<generator type="pl.kernelpanic.dbmonster.generator.NumberGenerator">
<property name="maxValue" value="01099999999"/>
<property name="minValue" value="01012340000"/>
<property name="nulls" value="0"/>
<property name="returnedType" value="long"/>
<property name="scale" value="0"/>
</generator>
</column>
<column name="OUT_CTN" databaseDefault="false">
<generator type="pl.kernelpanic.dbmonster.generator.NumberGenerator">
<property name="maxValue" value="01099999999"/>
<property name="minValue" value="01012340000"/>
<property name="nulls" value="0"/>
<property name="returnedType" value="long"/>
<property name="scale" value="0"/>
</generator>
</column>
<column name="IN_CELL" databaseDefault="false">
<generator type="pl.kernelpanic.dbmonster.generator.NumberGenerator">
<property name="maxValue" value="999"/>
<property name="minValue" value="0"/>
<property name="nulls" value="0"/>
<property name="returnedType" value="integer"/>
<property name="scale" value="0"/>
</generator>
</column>
<column name="OUT_CELL" databaseDefault="false">
<generator type="pl.kernelpanic.dbmonster.generator.NumberGenerator">
<property name="maxValue" value="999"/>
<property name="minValue" value="0"/>
<property name="nulls" value="0"/>
<property name="returnedType" value="integer"/>
<property name="scale" value="0"/>
</generator>
</column>
<column name="START_TIME" databaseDefault="false">
<generator type="pl.kernelpanic.dbmonster.generator.DateTimeGenerator">
<property name="startDate" value="2012-01-01 00:00:00"/>
<property name="endDate" value="2012-12-31 23:59:59"/>
<property name="returnedType" value="timestamp"/>
<property name="nulls" value="0"/>
</generator>
</column>
<column name="CALL_TIME" databaseDefault="false">
<generator type="pl.kernelpanic.dbmonster.generator.NumberGenerator">
<property name="maxValue" value="9999"/>
<property name="minValue" value="0"/>
<property name="nulls" value="10"/>
<property name="returnedType" value="long"/>
<property name="scale" value="0"/>
</generator>
</column>
<column name="END_TIME" databaseDefault="false">
<generator type="pl.kernelpanic.dbmonster.generator.DateTimeGenerator">
<property name="startDate" value="2012-01-01 00:00:00"/>
<property name="endDate" value="2012-12-31 23:59:59"/>
<property name="returnedType" value="timestamp"/>
</generator>
</column>
<column name="CLOSE_TYPE" databaseDefault="false">
<generator type="pl.kernelpanic.dbmonster.generator.NumberGenerator">
<property name="maxValue" value="5"/>
<property name="minValue" value="0"/>
<property name="nulls" value="0"/>
<property name="returnedType" value="short"/>
<property name="scale" value="0"/>
</generator>
</column>
</table>
</dbmonster-schema>

Data 생성
Schema.xml 파일을 생성했으면, DB에 Insert할 Data를 생성한다.

[root@i-10-24-5-10 dbmonster-core-1.0.3]# ./bin/dbmonster -s testTable-schema.xml -c dbmonster.properties
Setting DBMONSTER_HOME to: ./bin/..
Setting JAVA_HOME to: /usr/bin/
2012-10-23 22:23:28,343 INFO DBMonster - Let's feed this hungry database.
2012-10-23 22:23:28,606 INFO DBCPConnectionProvider - Today we are feeding: MySQL 5.0.95
2012-10-23 22:23:28,634 INFO Schema - Generating schema <Change me!>.
2012-10-23 22:23:28,635 INFO Table - Generating table <TestTable>.
2012-10-23 22:23:29,271 INFO Table - Generation of table <TestTable> finished.
2012-10-23 22:23:29,272 INFO Schema - Generation of schema <Change me!> finished.
2012-10-23 22:23:29,272 INFO DBMonster - Finished in 930 ms.

Data가 생성되었는지 확인한다.

 

mysql> use TestDB;
Database changed
mysql> select count(*) from TestTable;
+----------+
| count(*) |
+----------+
| 1000 |
+----------+
1 row in set (0.00 sec)
mysql> select * from TestTable limit 20;;
+----+------------+------------+---------+----------+-------------------------+-----------+-------------------------+------------+
| id | IN_CTN | OUT_CTN | IN_CELL | OUT_CELL | START_TIME | CALL_TIME | END_TIME | CLOSE_TYPE |
+----+------------+------------+---------+----------+-------------------------+-----------+-------------------------+------------+
| 1 | 1032489120 | 1034046740 | 430 | 216 | 2012-03-19 03:57:30.393 | 9627 | 2012-02-02 03:28:36.644 | 0 |
| 2 | 1037516179 | 1078507465 | 578 | 668 | 2012-06-02 22:45:50.174 | 9669 | 2012-08-30 07:20:05.945 | 2 |
| 3 | 1012356038 | 1062823205 | 458 | 23 | 2012-10-16 12:24:04.479 | 8628 | 2012-11-01 02:07:25.855 | 0 |
| 4 | 1030324472 | 1052732655 | 921 | 325 | 2012-05-31 00:40:01.723 | 5880 | 2012-11-20 00:46:27.297 | 3 |
| 5 | 1068699296 | 1099770375 | 201 | 622 | 2012-04-17 02:40:08.407 | 1457 | 2012-01-07 11:46:19.375 | 4 |
| 6 | 1018749880 | 1076889042 | 244 | 710 | 2012-07-18 01:50:30.371 | 7259 | 2012-02-23 11:17:29.787 | 3 |
| 7 | 1059011957 | 1055075881 | 152 | 495 | 2012-12-28 02:47:39.837 | 3624 | 2012-11-27 21:27:31.698 | 4 |
| 8 | 1077794156 | 1091257313 | 349 | 991 | 2012-11-09 23:24:31.201 | 1599 | 2012-04-24 14:15:10.451 | 0 |
| 9 | 1079262948 | 1081390626 | 381 | 61 | 2012-04-04 12:28:05.853 | 5535 | 2012-07-01 10:10:36.834 | 3 |
| 10 | 1048357662 | 1025266286 | 576 | 664 | 2012-01-27 19:24:35.718 | 1677 | 2012-05-27 08:17:17.236 | 0 |
| 11 | 1071593659 | 1098599432 | 817 | 718 | 2012-02-22 17:45:28.142 | NULL | 2012-03-16 18:16:02.364 | 1 |
| 12 | 1022310488 | 1041964996 | 50 | 764 | 2012-01-14 13:17:55.509 | 1907 | 2012-10-01 18:42:09.092 | 4 |
| 13 | 1098454407 | 1061970929 | 878 | 814 | 2012-12-28 16:38:22.205 | 2684 | 2012-11-20 11:24:21.24 | 3 |
| 14 | 1045018304 | 1098384794 | 439 | 361 | 2012-05-27 16:56:54.535 | 8469 | 2012-03-24 13:43:12.569 | 3 |
| 15 | 1048270201 | 1036236054 | 900 | 420 | 2012-11-11 18:48:44.671 | 1666 | 2012-11-20 05:43:02.53 | 2 |
| 16 | 1076683160 | 1071154066 | 299 | 936 | 2012-09-02 04:02:11.865 | 4151 | 2012-03-06 15:57:29.15 | 0 |
| 17 | 1044288754 | 1097387981 | 381 | 812 | 2012-03-03 10:55:24.94 | 9352 | 2012-10-23 06:23:03.044 | 0 |
| 18 | 1035749667 | 1026648098 | 271 | 597 | 2012-05-30 11:36:38.843 | 8085 | 2012-02-07 15:15:14.493 | 2 |
| 19 | 1082415375 | 1017146392 | 567 | 545 | 2012-09-15 10:45:06.257 | 6614 | 2012-08-11 07:15:03.63 | 2 |
| 20 | 1094317843 | 1061650357 | 13 | 182 | 2012-04-19 05:50:42.799 | 2315 | 2012-09-28 07:24:34.195 | 1 |
+----+------------+------------+---------+----------+-------------------------+-----------+-------------------------+------------+
20 rows in set (0.00 sec)


 
 

 

신고

'Open Sources > ETC' 카테고리의 다른 글

SonarQube  (0) 2016.02.03
업무 관리 도구 - 트렐로(Trello)  (0) 2014.07.12
Datagenerator - dbMonster Data Type  (0) 2013.03.05
Datagenerator - dbMonster Installation Guide  (0) 2013.03.05
Datagenerator - generatedata.com  (0) 2013.03.05
Grinder  (0) 2013.03.05

사용 목적

  • Database에 Insert할 Data를 생성하는데 사용한다.

Reference

Guide

MySQL Data 생성 방법

  • Num Result : 몇 건의 Data를 생성할 것인지를 입력한다.
  • Result Type : SQL로 선택한다.
  • Database table name : Data를 Insert 할 Table Name을 입력한다.
  • Statement Type : Data를 Insert하려면 Insert를 선택한다.
  • Database Type : MySQL로 선택한다.
  • Primary Key : 자동으로 ID를 count해서 넣기 위해서는 Add default auto-increment column을 선택한다. 만약 Primary Key를 생성하지 않으려면 None을 선택한다.
  • Misc Options
    • Include CREATE TABLE query : Data 생성 시, Table 생성하는 Query 추가 Option
    • Include DROP TABLE query : Data 생성 시, Table 삭제하는 Query 추가 Option
      기존 Table에 Data를 Appand하려면 Include CREATE TABLE query, Include DROP TABLE query Option을 Uncheck한다.

Date Format Code 설정 방법

  • Date Format Code를 설정할 때 아래의 문법으로 설정해야 한다.

Day of Month

d Numeric, with leading zeros 01--31
j Numeric, without leading zeros 1--31
S The English suffix for the day of the month st, nd or th in the 1st, 2nd or 15th.

Weekday

l Full name (lowercase 'L') Sunday – Saturday
D Three letter name Mon – Sun

Month

m Numeric, with leading zeros 01--12
n Numeric, without leading zeros 1--12
F Textual full January – December
M Textual three letters Jan - Dec

Year

Y Numeric, 4 digits Eg., 1999, 2003
y Numeric, 2 digits Eg., 99, 03

Time

a Lowercase am, pm
A Uppercase AM, PM
g Hour, 12-hour, without leading zeros 1--12
h Hour, 12-hour, with leading zeros 01--12
G Hour, 24-hour, without leading zeros 0-23
H Hour, 24-hour, with leading zeros 00-23
i Minutes, with leading zeros 00-59
s Seconds, with leading zeros 00-59
T Timezone abbreviation Eg., EST, MDT ...

Full Date/Time

c ISO 8601 2004-02-12T15:19:21+00:00
r RFC 2822 Thu, 21 Dec 2000 16:01:07 +0200

Examples

F j, Y g:i a November 6, 2010 12:50 am
F j, Y November 6, 2010
F, Y November, 2010
g:i a 12:50 am
g:i:s a 12:50:48 am
l, F jS, Y Saturday, November 6th, 2010
M j, Y @ G:i Nov 6, 2010 @ 0:50
Y/m/d \a\t g:i A 2010/11/06 at 12:50 AM
Y/m/d \a\t g:ia 2010/11/06 at 12:50am
Y/m/d g:i:s A 2010/11/06 12:50:48 AM
Y/m/d 2010/11/06

 

신고

'Open Sources > ETC' 카테고리의 다른 글

SonarQube  (0) 2016.02.03
업무 관리 도구 - 트렐로(Trello)  (0) 2014.07.12
Datagenerator - dbMonster Data Type  (0) 2013.03.05
Datagenerator - dbMonster Installation Guide  (0) 2013.03.05
Datagenerator - generatedata.com  (0) 2013.03.05
Grinder  (0) 2013.03.05

+ Recent posts