everydayminder

learn something everyday

Archive for the ‘Uncategorized’ Category

Sonar + Jenkins 설정

leave a comment »

현재 Jenkins를 통해 CI(Continuouse Integration)를 하고 있고,
코드의 정적 분석을 FindBugs, PMD, CheckStyle을 써서 리포트를 보고 있긴 하지만,
Sonar를 접하고 설치/ 사용해보고자 한다.

Sonar는 http://www.sonarqube.org에서 세부 정보를 확인할 수 있다.
Installation Guide 링크를 따라 가보니, Confluence를 사용하여 위키를 꾸며놨다.

“Get Started in Two Minutes”의 설명에 따르면,
설치하고, 실행하는 방법은 무척이나 단순해 보인다.

1. SonarQube 배포판을 압축풀고, 실행시킨다.
2. SonarQube Runner 배포판을 압축풀고, 실행시킨다.
3. 샘플 프로젝트를 압축풀고, sonar-runner를 실행시켜서 분석시킨다.
4. 결과를 화면에서 확인한다. (http://localhost:9000)

여기까지 사실로부터 유추할 수 있는 사실은,
– SonarQube는 서버 프로그램이다.
– SonarQube는 클라이언트 프로그램이다. (소스 분석을 위해 실행시켜야 함)
– 별도의 웹서버/DB 설정이 필요없다.

정도이다.

Sonar에 대한 소개/분석 자료를 통해 좀더 알아보면,

Sonar가 지원하는 DBMS는

Apache Derby (내장)
mySQL
Oracle
PostgreSQL
MS-SQL Server

등이다.

설치에 앞서 JDK가 1.5+으로 설치되어 있어야 하며,
Runner(소스 분석을 위해 실행시키는 프로그램)로는
– SonarQube Runner
– Maven
– Ant
를 지원한다고 한다.

따라서, 앞서 언급한 Installation guide는 최소한의 설정으로 가장 빨리
한 번 실행시켜보기 위한 설정이라 할 수 있다.

0. 설치/테스트 환경
OS : Windows7 (64)
JDK : JDK1.6
DB : –

1. 설치
압축을 풀고 (c:\dev\sonarqube-4.0, 이하 $SONAR_HOME), $SONAR_HOME\bin\windows-x86-64\bin에
있는 SartSonar.bat를 실행시킨다.

wrapper | --> Wrapper Started as Console
wrapper | Launching a JVM...
jvm 1 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
jvm 1 | Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved.
jvm 1 |
jvm 1 | 2013.12.18 11:02:42 INFO Web server is started

와 같은 메시지가 보이면서 시작되었다.
브라우저를 통해, localhost:9000으로 접속해봐도 화면이 휑하다.
Sonar의 기본 관리자 계정 정보는 admin:admin이니 접속해 보자.

2. 환경설정 확인
$SONAR_HOME\conf\sonar.properties 파일을 확인해 보자.
별도 DB 설정을 하지 않았기에, Apache Derby 내장 DBMS를 사용하도록 설정된 채이다.

sonar.jdbc.username=sonar
sonar.jdbc.password=sonar

#—– Embedded database H2
# Note: it does not accept connections from remote hosts, so the
# SonarQube server and the maven plugin must be executed on the same host.

# Comment the following line to deactivate the default embedded database.
sonar.jdbc.url=jdbc:h2:tcp://localhost:9092/sonar

와 같은 문구가 보이고,
그 밑으로는 Sonar가 지원하는 여러 다른 종류의 DBMS의 configuration들이 주석처리 되어 있다.
해당 DBMS를 사용할 경우, 변경하여 사용하면 될 것 같다.

3. 프로젝트 분석은 어떻게?
Sonar는 분석 결과를 보여주는 웹 애플리케이션이고, 결국 분석은 다른 프로그램들이 도와줘야 한다.
http://docs.codehaus.org/display/SONAR/Analyzing+Source+Code
에 안내된 바에 따르면,

프로젝트 분석은 아래의 방법중 하나를 택하면 된다.
Analyzing with SonarQube Runner (recommended analyzer)
Analyzing with SonarQube Ant Task
Analyzing with Maven
Analyzing with Gradle
CI Engines

Sonar에 안내된 2분안에 시작하기 튜토리얼에서도 샘플 프로젝트 디렉토리로부터, SonarQube Runner를
실행시키는 것으로 프로젝트 등록/분석을 시도하였다.

결국, Runner 등과 같은 프로그램이 분석 결과를 DBMS에 기록을 하면, Sonar 웹은 그 데이터를 DB로부터 읽어서
보여줄 뿐일 것이다.

프로젝트 등록을 위한 UI도 존재하지 않는 것 같은데, 공식 도움말에서도 이런 문구를 발견할 수 있다.
Adding a project to SonarQube is not done through the web interface, but automatically when the project is analyzed for the first time.

어쨌든, 프로젝트를 등록하기 위해서는 일단 분석을 한 번 시도하면 된다는 이야기이다.

4. Jenkins + Sonar 설정
나는 Jenkins를 이미 사용하고 있으므로, Jenkins에 Sonar 설정을 하는 방법에 대해 살펴보고자 한다.
Jenkins에 Maven 관련 설정이 되어있다고 가정한다.

Jenkins 관리 > 플러그인관리 > Sonar 관련 플러그인들을 찾아 설치한다. (Jenkins Sonar Plugin, Sonargraph Plugin)
이후, Jenkins를 재시작하고, Jenkins의 global 설정으로부터 Sonar 환경설정을 하자.

Jenkins 관리 > 시스템설정 > Sonar (고급 메뉴) 관련 항목을 지정한다.
Apache Derby 사용 및 기본 설정으로 그대로 사용한다면, 아마 다음과 같이 입력하게 될 것이다.

Server URL : http://localhost:9000
Sonar account login : admin
Sonar acocun password : admin
Database URL : jdbc:h2:tcp://localhost:9092/sonar
Database login : sonar
Database password : sonar

Sonar Runner에 대한 설정은 별도로 수행하지 않았다.
프로젝트 설정의 Post-build Actions로부터 Sonar를 선택하고, jdk 설치 정보만 변경하고 저장하였다.
(다른 설정은 디폴트 사용)

이후, 빌드를 수행하면, 해당프로젝트의 대시보드에도 Sonar 아이콘이 생겨있고, 링크도 클릭가능하다.
해당 링크를 클릭하면, 결국 처음에 설정한 바와 같이 http://localhost:9000으로 리다이렉션 될 것이다.
그리고, 이전에 비어있던 화면에 무언가 정보가 채워져 있는 것을 발견할 수 있다.
당연히, Jenkins를 통하지 않고도, 브라우저에서 직접 http://localhost:9000을 접속하면 동일한 화면을 볼 수 있다.
(DB에 분석 데이터가 있으니까)

볼 수 있는 내용들은 다음과 같다.
Lines of code
Documentation
Duplications
Complexity
Issues
Package tangle index
Unit Tests Coverage

해당 항목들을 클릭하면, 상세 내용을 볼 수 있다.
이슈들을 클릭하면, 어떤 부분이 문제가 되고, 어떻게 해결하면 좋을지도 조언해 주기 때문에
코드의 퀄리티를 높이는데 큰 도움이 될 것 같다.

Jenkins에 이미 SCM 관련 설정을 해두어, 소스코드 변동에 따른 폴링/자동 빌드를 설정해 두었기 때문에
소스 변동시마다 Sonar도 분석을 자동으로 업데이트 하게 되었다.

5. Maven 단독
Maven으로 소스 분석을 하려면, maven 관련 설정을 변경해줘야 한다.
Sonar에 공식적으로 안내된, maven 설정은

<settings>
<profiles>
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!– Example for MySQL–>
<sonar.jdbc.url>
jdbc:mysql://localhost:3306/sonar?useUnicode=true&amp;characterEncoding=utf8
</sonar.jdbc.url>
<sonar.jdbc.username>sonar</sonar.jdbc.username>
<sonar.jdbc.password>sonar</sonar.jdbc.password>

<!– Optional URL to server. Default value is http://localhost:9000 –>
<sonar.host.url>
http://myserver:9000
</sonar.host.url>
</properties>
</profile>
</profiles>
</settings>

실행은,
mvn clean install -DskipTests=true
mvn sonar:sonar
와 같이 실행하면 된다.

그런데, 위의 설정만으로는 실제 사용시 번거로울 것 같다.

위의 설정에서 언급한 바와 같이, 분석을 어떻게 수행하느냐의 문제에 대해 생각해 보자.
Jenkins에 설정한 경우,
– Who : Jenkins
– How : Maven 또는 Runner
– When : 소스 변경이 되었을 때
로 생각할 수 있는데 비해,

Maven으로 단독 설정할 경우,
– Who : 사용자
– How : Maven
– When : 사용자가 명령어를 실행할 경우
가 되어 버린다. 결국, 소스를 사용자가 직접 최신 버전으로 업데이트 한 후, maven 명령어를 돌려야 의미가 있을 것이다.

즉, 소스 변경과 함께 자동으로 최신 소스를 검사할 수 있도록 설정하지 않고서는 별도의 maven 실행을 통한 소스 검사만으로는
활용도가 낮아진다.

6. 요약
– Jenkins와 같은 CI tool과 연계해서 Sonar 검사를 하도록 하거나
– 열심히 알아서 소스 갱신/ 검사 돌리자.

* SCM Activity라는 플러그인이 있는 것을 확인했으나, 주기적으로 폴링하여 소스를 가져오고 검사하는 용도가 아닌
SCM blame 정보를 출력해주기 위한 용도인 듯하다. (http://docs.codehaus.org/display/SONAR/SCM+Activity+Plugin)

*  소스 정적 검사 및 해결책 제시가 제법 괜찮다. 쓸만 한 것 같다.

Written by everydayminder

December 26, 2013 at 23:01

Posted in java, tools, Uncategorized

FreeNX 설치 (CentOS 6.x; 64bits)

leave a comment »

VNC보다 성능이 좋다고 이름이 나있는 FreeNX (www.nomachine.com)을 설치하는 방법은 의외로 간단하다.

환경 : 서버측 CentOS6.4 (64bits)
클라이언트측 Windows7 (64bits)

CentOS6.x 기준으로 설치하고, 클라이언트 접속을 테스트해보자.
먼저 yum 명령어로 freenx를 다음과 같이 간편하게 설치할 수 있다.

freenx는 extras repository에 이미 있기 때문에

yum install freenx
yum install nxagent

(내 경우, nxagent를 처음에 설치하지 않았더니,
freenx는 정상적으로 설치하고, 계정까지 생성했지만, 접속이 실패하였고
로그를 보았더니 nxagent를 찾을 수 없다는 에러가 발견되었다.)

이 명령만으로도 freenx의 설치는 일단 완료된다.
freenx의 설정관련 내용은 /etc/nxserver에 설치된다.

server의 환경설정은 node.conf를 수정하는 것만으로 완료되는데,
node.conf를 백업해두고, node.conf.sample의 사본으로 작업하자.

mv node.conf node.conf.bak
cp node.conf.sample node.conf

vi node.conf를 실행하여, nxserver의 환경설정을 다음과 같이 변경/주석 해제한다.

SSHD_PORT=22 (주석 해제)
ENABLE_PASSDB_AUTHENTICATION="1"
ENABLE_SSH_AUTHENTICATION="1"

파일을 저장한다.

nxserver를 실행하면 여러가지 실행 옵션이 있다.
nxserver –status를 실행하여 현재 상태를 확인한다.

NX> 100 NXSERVER – Version 3.2.0-74-SVN OS (GPL, using backend: not detected)
NX> 110 NX Server is running
NX> 999 Bye

현재 설치된 버전의 3.2.0-74이고, 동작중이라는 것을 알 수 있다.

nxsever --stop

을 실행하면, freenx가 종료된다.

이제 사용자를 추가한다.

nxserver --adduser luran

freenx 접속을 위해 luran이라는 계정이 생성될 것이다.

nxserver --passwd luran

luran이라는 계정의 패스워드를 물어올 것이다.

여기까지 실행하면,
/home/luran/.ssh 디렉토리에 ssh 접속을 위한 키가 생성되었을 것이고,
/etc/nxserver에도 해당 ID용 공개키가 client.id_dsa.key 로 생성되었을 것이다.

이제 client.id_dsa.key파일 또는 파일의 내용을 실제 접속할 클라이언트에서 쓸 수 있도록 복사하자.
만약, SSH 기본 포트 이외의 다른 포트로 변경했다면 방화벽 룰도 변경해줘야 한다.

nxserver --start

를 실행하여 띄운다.

클라이언트에서 설정할 내용은 간단하다.
Windows의 경우, 3.5 버전의 NXClient를 구해서 설치한 후,

Host와 Port 정보를 기입하고, Key 버튼을 클릭하여 앞서 별도로 저장한 key 파일을 지정한다.
Desktop은 Unix/GNOME으로 하고, 접속속도는 원하는대로 설정한다.

앞서 생성한 계정정보를 입력하는 것으로, 설정을 모두 마쳤다.
이제 접속하여 창이 뜨는지 확인하자.

Written by everydayminder

December 4, 2013 at 13:06

Posted in linux, Uncategorized

Tagged with ,

jasypt + BouncyCastle AES 설정

leave a comment »

Sun의 JCE에서도 AES를 지원하지만, Password Based Encryption방식으로 보다 많은 종류의 암호화 알고리즘을 지원하는 BouncyCastle 라이브러리를
설치하고, jasypt에서도 BouncyCastle을 사용한 AES 암/복호화를 사용하도록 설정해 보았다.

친근한 이름(어린 아이들이 좋아할)과는 다르게, 보안라이브러리이다.

1. BouncyCastle 다운로드
BouncyCastle의 공식 사이트는 http://www.bouncycastle.org이다.
본인이 사용하는 jvm 버전에 맞는 것으로 다운로드한다.
내 경우, jdk 1.6을 사용하고 있어 bcprov-jdk16-146.jar를 받았다.
maven을 사용하고 있다면, pom.xml에 아래와 같이 추가하여 다운로드 할 수도 있다.

 <dependency>
 <groupId>org.bouncycastle</groupId>
 <artifactId>bcprov-jdk16</artifactId>
 <version>1.46</version>
 </dependency>
 

2. BouncyCastle 설치
jar 파일이므로 임의의 디렉토리에 복사 후, classpath에 추가하거나,
$JAVA_HOME/jre/lib/ext에 복사하여 자동으로 classpath가 인식하도록 한다.

maven을 사용한다면, 위의 dependency 설정으로도 충분할 것이다.
라이브러리 설치 자체는 이것으로 끝났으나, 추가 환경설정이 필요하다.

3. BouncyCastle을 사용하기 위한 환경설정
BouncyCastle을 JCE Provider로 인식시키기 위해 추가 설정이 필요하다.
$JAVA_HOME/jre/lib/security/java.security 파일에 BouncyCastle을 등록하자.

4. jasypt에 BouncyCastle AES 사용설정
(1) application-context.xml에 hibernate.cfg.xml 설정

 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
 <property name="dataSource" ref="dataSource" />
 <property name="packagesToScan" value="com.luran" />
 <property name="configLocation" value="classpath:hibernate.cfg.xml" />
 </bean>
 

(2) hibernate.cfg.xml에 mapping.hbm.xml 지정 (type 선언 내용 포함)

 <hibernate-configuration>
 <session-factory>
 ...
 <mapping resource="META-INF/mapping.hbm.xml"/>
 ...
 </session-factory>
 </hibernate-configuration>
 

(3) mapping.hbm.xml내 타입 선언부 중, 알고리즘 변경 (PBEWITHSHA256AND128BITAES-CBC-BC)

 <hibernate-mapping package="com.luran.jasypt_test">
 <typedef name="encryptedString" class="org.jasypt.hibernate3.type.EncryptedStringType">
 <param name="algorithm">PBEWITHSHA256AND128BITAES-CBC-BC</param>
 <!-- <param name="providerName">BC</param> -->
 <param name="password">jasypt</param>
 <param name="keyObtentionIterations">1000</param>
 <!-- <param name="stringOutputType">hexadecimal</param> -->
 </typedef>
 </hibernate-mapping>
 

Written by everydayminder

July 17, 2013 at 05:08

Posted in java, Uncategorized

Google Task를 별도 창으로 설정하기

leave a comment »

구글 태스크의 주소는 다음과 같다.

https://mail.google.com/tasks/ig

https://mail.google.com/tasks/android

https://mail.google.com/tasks/iphone

Chrome에서 위의 주소중 하나를 입력하고,

Menu로부터 Tools > Create Application Shortcut을 클릭하여 원하는 곳에 바로가기 버튼을 만들어 두고 쓰자.

Written by everydayminder

July 10, 2013 at 00:41

Posted in Uncategorized

Twisted를 사용하여 TCP Server와 Client를 한번에

leave a comment »

Twisted에서 제공하는 TAC를 사용하면, 여러개의 서비스를 동시에 묶어 application service로 등록 사용할 수 있다.

앞서 만들었던 TestClient에 추가적으로 Server의 요소를 넣고자 한다.
예를 들면, Administrator의 목적으로.

이를 위해, 몇몇 패키지를 import 한다.




from twisted.internet.protocol import ServerFactory
from twisted.application import internet, service

추가적으로 서버의 프로토콜과 팩토리를 정의한다.




class AdminProtocol(LineReceiver):
    delimiter = ‘n’;
    
    def lineReceived(self, line):
        print line
        
    def connectionMade(self):
        print ‘$NEW CLIENT : %d clients are connected’ % self.factory.numProtocols
        if self.factory.numProtocols > 100:
            self.transport.write(“Too many connections, try later”)
            self.transport.loseConnection()
            
    def connectionLost(self, reason):
        self.factory.numProtocols = self.factory.numProtocols – 1       
        print ‘$CONNECTION LOST : %d clients are remained’ % self.factory.numProtocols
        
    def startedConnecting(self, connector):
        print ‘$started connecting..’

class AdminFactory(ServerFactory):
    protocol = AdminProtocol
   
    numProtocols = 0
    ID = 0
   
    def __init__(self):
        print ‘initialized’


Service로 등록하기 위해,
service.Service를 상속받아  각각  ServerFactory와 ClientFactory를 리턴하도록 구현한다. 




class AdminService(service.Service):
    def getTestFactory(self):
        f = TestFactory()
        f.protocol = TestClient
        return f
   
    def getAdminFactory(self):
        f = AdminFactory()
        f.protocol = AdminProtocol
        return f

애플리케이션 서버로 묶어 주기 위해, 다음과 같이 등록한다.




application = service.Application(‘test’, uid=1, gid=1)
f = AdminService()
serviceCollection = service.IServiceCollection(application)
internet.TCPServer(8002, f.getAdminFactory()).setServiceParent(serviceCollection)
internet.TCPClient(‘localhost’, 8001, f.getTestFactory()).setServiceParent(serviceCollection)

이와 같이 작성한 파이썬 파일을 tac 파일로 변경하면, twisted application으로 실행할 수 있게 되는데, 이대 twistd 명령어로 실행시켜야 한다.

twistd -ny finger.tac   #just like before
twisted -y finger.tac   # daemonize, keep pid in twistd.pid

Written by everydayminder

September 19, 2008 at 02:28

Posted in Uncategorized