AWS에 설치된 MySQL DB를 외부 접속이 가능 하도록 설정

DevOps|2015. 2. 22. 01:45

설치 환경

AWS에 Ubuntu 14.04를 기반으로 인스턴스를 생성하고 sudo apt-get install mysql-server 명령으로 MySQL을 설치

  • 버전 - MySQL 5.5(5.5.41-0ubuntu0.14.04.1)

AWS - Security Group 설정

Inbound 탭에서 3306 포트를 열고 SourceAnywhere(0.0.0.0)으로 설정

MySQL 설정 파일(/etc/mysql/my.cnf) 수정

bind-address 항목을 찾아서 0.0.0.0으로 변경(이전 값은 127.0.0.1)

MySQL 재시작

service mysql restart

ROOT 계정으로 외부에서 접속 가능하게 하려면

아래의 명령을 MySQL monitor에서 실행

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 49
Server version: 5.5.41-0ubuntu0.14.04.1 (Ubuntu)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'your password' WITH GRANT OPTION;
Query OK, 0 rows affected (0.12 sec)


댓글()

Spring Shell Command 구현

Java|2015. 1. 7. 22:16

개요

HelloWorldCommands 클래스를 통해서 Spring Shell 커맨드 구현 방법을 살펴 보겠습니다.

Marker interface

HelloWorldCommands는 org.springframework.shell.core.CommandMarker 인터페이스를 구현하고 있습니다.

@Component
public class HelloWorldCommands implements CommandMarker {

}

CommandMarker는 마커 인터페이스라서 커맨드 구현체라는 것을 알려주기 위해서 implements 할 뿐입니다. 따라서 구현할 메소드는 없습니다.
@Component annotation은 component-scan을 통해 bean으로 등록되라고 붙여 줬습니다.

CLI Annotation

HelloWorldCommands는 모두 3개의 annotation을 사용하여 쉘에서의 동작을 제어합니다.

CliAvailabilityIndicator

어떤 커맨드가 쉘에서 사용 가능한지를 알려주기 위해서 사용합니다. 이 annotation은 boolean 값을 반환하는 메소드에 붙이며, 이 메소드는 annotation에 명시한 커맨드의 사용 가능 여부를 반환합니다.
HelloWorldCommands에서는 hw simple, hw complex, hw enum 커맨드의 사용 가능 여부를 알려 주기 위해서 사용하였습니다.

    private boolean simpleCommandExecuted = false;

    @CliAvailabilityIndicator({"hw simple"})
    public boolean isSimpleAvailable() {
        //always available
        return true;
    }

    @CliAvailabilityIndicator({"hw complex", "hw enum"})
    public boolean isComplexAvailable() {
        if (simpleCommandExecuted) {
            return true;
        } else {
            return false;
        }
    }

위에서 isSimpleAvailable() 메소드는 언제나 true를 반환하여, hw simple 커맨드가 언제나 사용 가능하다고 알려주고 있습니다.
isComplexAvailable 메소드는 simpleCommandExecuted 변수의 상태에 따라서 hw complex, hw enum 커맨드의 사용 가능 여부를 알려줍니다.

댓글()

Spring Shell 소개

Java|2015. 1. 2. 11:17

소개

스프링 프로그래밍 모델을 기반으로 손쉽게 커맨드라인 애플리케이션(interactive shell)을 만들 수 있도록 도와주는 프로젝트입니다.

홈페이지(GitHub)

https://github.com/spring-projects/spring-shell

샘플 애플리케이션

Spring Shell은 샘플 애플리케이션을 제공합니다. HelloWorld 애플리케이션은 부트스트랩(Bootstrap)/커맨드(Command)/베너(Banner)/프롬프트(Prompt)의 기본 구현 방법을 보여줍니다.
샘플을 통해 Spring Shell을 이해하는게 효과적이기 때문에 이를 통해 Spring Shell 사용 방법을 하나하나 설명토록 하겠습니다.

Clone

먼저 Spring Shell 프로젝트를 Clone합니다.

~$ git clone git@github.com:spring-projects/spring-shell.git

빌드 및 실행

Clone이 완료되면, samples/helloworld 디렉토리로 이동한 후 ./gradlew installApp 명령으로 HelloWorld 샘플을 빌드합니다.

~$ cd spring-shell/samples/helloworld
~/spring-shell/samples/helloworld$ ./gradlew installApp
:compileJava
:processResources
:classes
:jar
:startScripts
:installApp

BUILD SUCCESSFUL

./gradlew -q run 명령 혹은 build/install/helloworld/bin/helloworld 스크립트를 실행하면 HelloWorld 샘플을 실행할 수 있습니다.
build/install/helloworld 디렉토리에는 실행 스크립트(bin/helloworld)와 의존 라이브러리(lib/*.jar)가 모두 들어 있기 때문에 이 디렉토리만 배포하면 누구든 이 애플리케이션을 사용할 수 있게 됩니다.
사실 실행만 원한다면 빌드 없이 ./gradlew -q run 명령만 사용해도 됩니다.

~$ cd spring-shell/samples/helloworld
~/spring-shell/samples/helloworld$ ./gradlew -q run
=======================================
*                                     *
*            HelloWorld               *
*                                     *
=======================================
Version:1.2.3
Welcome to HelloWorld CLI
hw-shell>

구현 상세

HelloWorld는 아래 5개의 클래스로 구현되어 있었습니다.

  • org.springframework.shell.samples.helloworld.Main
  • org.springframework.shell.samples.helloworld.commands.HelloWorldCommands
  • org.springframework.shell.samples.helloworld.commands.MyBannerProvider
  • org.springframework.shell.samples.helloworld.commands.MyHistoryFileNameProvider
  • org.springframework.shell.samples.helloworld.commands.MyPromptProvider

Main 클래스는 org.springframework.shell.Bootstrap 클래스의 main 메소드를 호출하여 애플리케이션을 실행합니다.

    /**
     * Main class that delegates to Spring Shell's Bootstrap class in order to simplify debugging inside an IDE
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        Bootstrap.main(args);
    }

이 때 "/META-INF/spring/spring-shell-plugin.xml" 파일을 이용해 ApplicationContext를 생성합니다. spring-shell-plugin.xml 파일은 다음과 같이 단촐합니다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="org.springframework.shell.samples.helloworld.commands" />

</beans>

component-scan을 통해 bean을 찾기 때문에 Main 이외의 모든 클래스는 Component annotation을 달고 있습니다.

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class MyPromptProvider extends DefaultPromptProvider {

    @Override
    public String getPrompt() {
        return "hw-shell>";
    }


    @Override
    public String getProviderName() {
        return "My prompt provider";
    }

}

위의 MyPromptProvider 클래스는 Order annotation 또한 달고 있는데, 이는 혹 클래스 패스에 다른 plugin이 Provider(Banner/Prompt/HistoryFileName) 구현체를 가지고 있더라도 내가 구현한 Provider를 우선하도록(Ordered.HIGHEST_PRECEDENCE) 합니다. Provider에 대해서는 곧 설명합니다.

Provider는 Spring Shell이 쉘을 커스터마이징 할 수 있도록 제공하는 확장 포인트로 모두 org.springframework.shell.plugin.NamedProvider 인터페이스를 상속한 인터페이스입니다.

HelloWorld가 사용하는 구현 클래스는 모두 Spring Shell이 제공하는 각 Provider의 기본 구현체(DefaultXXXProvider)를 상속하고 있습니다. HelloWorld는 총 3개의 Provider 구현 클래스를 가지고 있습니다.

  • MyBannerProvider는 이름이 알려주듯이 배너 정보를 담고 있는데, 이외에 버전정보(getVersion()), 환영 메시지(getWelcomeMessage()) 또한 제공합니다.
  • MyPromptProvider는 프롬프트 모양을 정의(getPrompt())합니다.
  • MyHistoryFileNameProvider는 쉘의 동작 히스토리를 담을 로그파일 이름(my.log)을 정의합니다.

MyHistoryFileNameProvider의 코드는 다음과 같습니다.

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class MyHistoryFileNameProvider extends DefaultHistoryFileNameProvider {

    public String getHistoryFileName() {
        return "my.log";
    }

    @Override
    public String getProviderName() {
        return "My history file name provider";
    }

}

MyBannerProvider의 코드는 다음과 같습니다.

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class MyBannerProvider extends DefaultBannerProvider  {

    public String getBanner() {
        StringBuffer buf = new StringBuffer();
        buf.append("=======================================" + OsUtils.LINE_SEPARATOR);
        buf.append("*                                     *"+ OsUtils.LINE_SEPARATOR);
        buf.append("*            HelloWorld               *" +OsUtils.LINE_SEPARATOR);
        buf.append("*                                     *"+ OsUtils.LINE_SEPARATOR);
        buf.append("=======================================" + OsUtils.LINE_SEPARATOR);
        buf.append("Version:" + this.getVersion());
        return buf.toString();
    }

    public String getVersion() {
        return "1.2.3";
    }

    public String getWelcomeMessage() {
        return "Welcome to HelloWorld CLI";
    }

    @Override
    public String getProviderName() {
        return "Hello World Banner";
    }
}

HelloWorld를 실행하면 배너와 버전 정보, 환영 메시지가 출력된 후 hw-shell> 프롬프트 옆에서 커서가 깜빡입니다.
앞에서 설명했듯이 이 때 출력되는 모든 정보는 MyBannerProvider가 제공하며, hw-shell> 프롬프트는 MyPromptProvider에서 정의하고 있습니다.
그리고 HelloWorld를 실행한 디렉토리를 탐색해 보면 MyHistoryFileNameProvider에서 정의한 my.log 파일이 생성된 것을 확인할 수 있습니다.

=======================================
*                                     *
*            HelloWorld               *
*                                     *
=======================================
Version:1.2.3
Welcome to HelloWorld CLI
hw-shell>

지금까지 Spring Shell에 대한 기본적인 내용과 Provider에 대해 알아봤습니다.
가장 중요한 커맨드 클래스에 대해서는 따로 글을 올리겠습니다.

댓글()

Install knife-solo(knife-solo 설치)

DevOps|2014. 10. 21. 09:00

knife-solo는 gem을 통해 쉽게 설치가 가능합니다.

$ gem install knife-solo
Fetching: knife-solo-0.4.2.gem (100%)
Thanks for installing knife-solo!

If you run into any issues please let us know at:
  https://github.com/matschaffer/knife-solo/issues

If you are upgrading knife-solo please uninstall any old versions by
running `gem clean knife-solo` to avoid any errors.

See http://bit.ly/CHEF-3255 for more information on the knife bug
that causes this.
Successfully installed knife-solo-0.4.2
1 gem installed
Installing ri documentation for knife-solo-0.4.2...
Installing RDoc documentation for knife-solo-0.4.2...

Chef를 설치한 후, /opt/chef/embedded/bin 디렉토리를 PATH에 추가하면 쉽게 gem을 사용할 수 있으니 Chef설치 글을 참고하세요.

댓글()

Install Chef on CentOS(Chef 설치)

DevOps|2014. 10. 20. 09:00

Chef 설치는 아래와 같이 간단한 명령으로 가능합니다. 하지만 같이 설치되는게 많아서 무척 오래 걸립니다. 유의하세요.

$ curl -L http://www.opscode.com/chef/install.sh | sudo bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
 48 16514   48  8001    0     0   6550      0  0:00:02  0:00:01  0:00:01  8687Downloading Chef  for el...
100 16514  100 16514    0     0   9853      0  0:00:01  0:00:01 --:--:-- 12010
downloading http://www.opscode.com/chef/metadata?v=&prerelease=false&nightlies=false&p=el&pv=6&m=i686
  to file /tmp/install.sh.1845/metadata.txt
trying curl...
url     http://opscode-omnibus-packages.s3.amazonaws.com/el/6/i686/chef-11.16.4-1.el6.i686.rpm
md5     da7bbe41d9510de62adf6afe89ed2ecd
sha256  545075be04de512c780c961b3aa3809c4540fd68c47c167eced67a8daa0821b7
downloaded metadata file looks valid...
downloading http://opscode-omnibus-packages.s3.amazonaws.com/el/6/i686/chef-11.16.4-1.el6.i686.rpm
  to file /tmp/install.sh.1845/chef-11.16.4-1.el6.i686.rpm
trying curl...
Comparing checksum with sha256sum...
Installing Chef
installing with rpm...
warning: /tmp/install.sh.1845/chef-11.16.4-1.el6.i686.rpm: Header V4 DSA/SHA1 Signature, key ID 83ef826a: NOKEY
Preparing...                ########################################### [100%]
   1:chef                   ########################################### [100%]
Thank you for installing Chef!

설치 후에는 아래와 같이 /opt/chef/embedded/bin 디렉토리를 PATH에 추가해 줍니다. ruby, gem 등을 따로 설치하지 않고도 사용할 수 있게 됩니다. 상당히 유용하더군요.

$ echo 'export PATH="/opt/chef/embedded/bin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile


댓글()

CentOS 공개키 인증으로 암호 없이 로그인

설치&설정|2014. 10. 18. 21:31

Client(PC)에서 키 생성

아래와 같이 ssh-keygen 명령을 이용해서 키를 생성하면, [home directory]/.ssh 디렉토리에 id_rsa.pub 파일이 생성된 것을 확인할 수 있습니다.

$ ssh-keygen -t rsa -C 'your@email.addr'
Generating public/private rsa key pair.
Enter file in which to save the key (/home/deployer/.ssh/id_rsa):
Created directory '/home/deployer/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/deployer/.ssh/id_rsa.
Your public key has been saved in /home/deployer/.ssh/id_rsa.pub.
The key fingerprint is:
df:07:63:c5:46:ff:9b:ac:03:b6:ed:70:b7:77:f2:1e your@email.addr
The key's randomart image is:
+--[ RSA 2048]----+
|              .  |
|             o . |
|              + .|
|             o  .|
|        S   +   .|
|         . = o. o|
|          o.=..E |
|           .o++ =|
|            .o.==|
+-----------------+

Server에서 키 등록

서버에서는 로그인 하려는 사용자의 홈디렉토리에 .ssh 디렉토리와 .ssh/authorized_key 파일을 생성하고, 파일 내용으로 id_rsa.pub 키를 넣어 줍니다.

$ cd ~
$ mkdir -m 700 .ssh
$ cd .ssh

### Client에서 생성한 id_rsa.pub 키 값을 내용으로       ###
### authorized_keys 파일을 ~/.ssh 디렉토리에 생성합니다 ###
$ echo 'ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAvrdrApARFpicubfKHMVmNpEB6P3KsoVuXQOPPTPTOTveWsrYiPYesFSn6c9xaS3ZN8041A0/pIZU2clc94Rt+hPoU0Lgpv2nZ8WJoVPXNbHWRehF8VtrpOp4emnyi52wRtzGF7pBaazwRhNVFI1HF89IwEKX8LNXAsbOmpTR9HGZ5Y+qt2dZzRdX4s7G3ReqFa6t8lkErVolr9Z8HxyAZ9ubOQ58tK4uTnFdSAa1bRWeEKO/E+GfPnuMfFu2kT//9BrDDc2iy/eTtXL/3bJ4CNJ0ydDutGNP/H+D2IPgXx2ueawXVACSEQ4gczBTTTy/XJjHsaLiX23Z3eb+4BFvhQ== your@email.addr' >> authorized_keys

### authorized_keys 파일에 권한 설정                   ###
$ chmod 600 authorized_keys

Server에서 키 기반 인증 허용

/etc/ssh/sshd_config 파일의 내용을 확인한 후, 키 기반 인증이 허용이 안되어 있으면 수정한다.

아래와 같이 키 기반 인증에 관한 항목에 주석 처리가 되어 있으면 주석을 해제한다.

#RSAAuthentication yes
#PubkeyAuthentication yes
#AuthorizedKeysFile      .ssh/authorized_keys

sshd_config 파일을 수정했으면 sshd를 재시작한다.

$ service sshd restart

댓글()

Spring Tool Suite(STS)에 Subversion Plugin 설치

Developer Tools|2014. 10. 14. 13:42

Spring Tool Suite(STS)는 간편하게 Subversion(SVN) 플러그인을 설치하는 방법을 제공합니다.
아래의 방법으로 Subversive 혹은 Subclipse를 설치합니다.


먼저 Dashboard를 엽니다.

sts subversive dashboard menu


Dashboard가 열리면, Extensions 탭을 선택합니다.

sts subversive select tab


Find 필드에 Subversive/Subclipse를 입력하여 플러그인을 찾습니다(둘 중 하나만 설치하면 됩니다). 저는 Subversive를 찾았습니다. 검색 결과가 나오면 앞쪽의 체크박스를 선택합니다.

sts subversive find subversive


Install 버튼을 눌러서 설치를 진행합니다. 이후 검증/재시작 등에 대한 경고가 나오면 모두 Yes를 선택하여 설치를 완료합니다.

sts subversive install subversive

댓글()

네스프레소 16캡슐SET 케이스를 활용한 캡슐 보관함 제작

기타|2014. 10. 13. 15:47

20140927_111032

네스프레소 커피 머신을 구매하면 "16가지 그랑 크뤼 캡슐 박스"라는 것을 줍니다. 이 샘플용 케이스가 꽤나 탄탄하고 예뻐서 캡슐 보관함을 만들어 봤습니다.

20140927_111200

20140927_110319

샘플 케이스에 맞춰서 나무 틀을 만들고.

20140927_110335

20140927_110319

바닥으로 빠지지 않도록 나무 조각으로 막아 줬습니다.

20140927_110350

두 개만 붙였는데 하나쯤 추가 해주는게 좋을 걸 그랬습니다. 들어 올려서 캡슐을 고를라치면 조금 불안정합니다.

20140927_110357

틀은, 외관 상 깨끗하고 크게 힘을 받을일도 없을 것 같아서 모두 본드로 붙여서 완성했습니다.

사방에 있는 안쪽으로 돌출된 부분은 모두 칼로 잘라서 뚜껑이 부드럽게 열릴 수 있도록 합니다. 한 쪽에 두 개씩 모두 8개를 잘라내야 합니다.

20140927_110518

20140927_110455

본드가 굳기를 기다렸다가 캡슐을 가득 채운 샘플 케이스를 넣어 주면 완성입니다.

20140927_111103

댓글()

SonarQube Runner를 사용하여 프로젝트 분석하기

DevOps|2014. 8. 17. 17:11

다운로드

아래의 SonarQube Runner 페이지에서 다운로드할 수 있습니다.

Installing and Configuring SonarQube Runner

여기에서는 2.4 버전을 다운로드하여 사용했습니다.

설치

다운로드 받은 zip 파일을 원하는 경로를 지정하여 압축을 해제합니다. <설치 디렉토리>/conf/sonar-runner.properties 파일을 열어서 자신의 환경에 맞게 수정합니다. 동일한 PC에 SonarQube를 설치했고 기본 설정을 변경하지 않았으면, sonar.jdbc.* 속성의 주석을 해제하는 정도가 할일의 전부입니다.

저는 SonarQube 서버를 같은 PC에 설치했고 MySQL을 사용하고 있기 때문에 아래과 같이 설정을 완료했습니다.

#----- Default SonarQube server
sonar.host.url=http://localhost:9000

#----- PostgreSQL
#sonar.jdbc.url=jdbc:postgresql://localhost/sonar

#----- MySQL
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&amp;characterEncoding=utf8

#----- Oracle
#sonar.jdbc.url=jdbc:oracle:thin:@localhost/XE

#----- Microsoft SQLServer
#sonar.jdbc.url=jdbc:jtds:sqlserver://localhost/sonar;SelectMethod=Cursor

#----- Global database settings
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar

#----- Default source code encoding
sonar.sourceEncoding=UTF-8

#----- Security (when 'sonar.forceAuthentication' is set to 'true')
#sonar.login=admin
#sonar.password=admin

SONAR_RUNNER_HOME 시스템 환경변수를 만들고 그 값으로 [설치 디렉토리]를 설정합니다.

[설치 디랙토리]\bin 디렉토리(%SONAR_RUNNER_HOME%\bin)를 path에 추가합니다. 이제 SonarQube Runner의 설치가 완료되었습니다.

프로젝트 분석

분석할 프로젝트의 루트 디렉토리에 sonar-project.properties 파일을 생성합니다. 저는 Enyo Framework를 clone 한 후 분석했기 때문에 아래와 같이 내용을 채웠습니다.

source 디렉토리에 분석 할 JavaScript 소스 코드가 있어서 sonar.sources 속성 값으로 지정했으며, SonarQube Update Center에서 JavaScript 플러그인을 설치했습니다.

sonar.projectKey=Enyo
sonar.projectName=Enyo
sonar.projectVersion=2.3
sonar.sources=source
sonar.sourceEncoding=UTF-8

이제 명령 프롬프트를 띄우고 프로젝트 루트 디렉토리로 이동한 후, sonar-runner를 실행합니다(SonarQube 서버는 이미 동작 중이어야 합니다).

D:\dev\repos\enyo>sonar-runner
D:\dev\tool\sonar-runner
SonarQube Runner 2.4
Java 1.7.0_60 Oracle Corporation (32-bit)
Windows 7 6.1 x86
INFO: Runner configuration file: D:\dev\tool\sonar-runner\conf\sonar-runner.properties
INFO: Project configuration file: D:\dev\repos\enyo\sonar-project.properties
INFO: Default locale: "ko_KR", source code encoding: "UTF-8"
INFO: Work directory: D:\dev\repos\enyo\.\.sonar
INFO: SonarQube Server 4.4
16:06:33.508 INFO  - Load global settings
16:06:34.063 INFO  - User cache: C:\Users\heuser\.sonar\cache
16:06:34.087 INFO  - Install plugins
16:06:35.588 INFO  - Install JDBC driver
16:06:35.610 INFO  - Create JDBC datasource for jdbc:mysql://localhost:3306/sonar?useUnicode=true&amp;characterEncoding=utf8
16:06:36.479 INFO  - Initializing Hibernate
16:06:45.716 INFO  - Loading technical debt model...
16:06:45.754 INFO  - Loading technical debt model done: 37 ms
16:06:45.772 INFO  - Load project settings
16:06:45.805 INFO  - Apply project exclusions
16:06:46.069 INFO  - -------------  Scan Enyo
16:06:46.131 INFO  - Load module settings
16:06:51.278 INFO  - Loading rules...
16:06:51.470 INFO  - Loading rules done: 192 ms
16:06:51.566 INFO  - Configure Maven plugins
16:06:51.697 INFO  - No quality gate is configured.
16:06:52.256 INFO  - Base dir: D:\dev\repos\enyo\.
16:06:52.257 INFO  - Working dir: D:\dev\repos\enyo\.\.sonar
16:06:52.259 INFO  - Source dirs: D:\dev\repos\enyo\source
16:06:52.262 INFO  - Source encoding: UTF-8, default locale: ko_KR
16:06:52.266 INFO  - Index files
16:06:54.633 INFO  - 120 files indexed
16:06:56.894 INFO  - Quality profile for js: Sonar way
16:06:56.939 INFO  - JaCoCo report not found.
16:06:56.944 INFO  - JaCoCo IT report not found.
16:06:56.947 INFO  - JaCoCo reports not found.
16:06:56.984 INFO  - Sensor QProfileSensor...
16:06:56.991 INFO  - Sensor QProfileSensor done: 7 ms
16:06:56.991 INFO  - Sensor JavaScriptSquidSensor...
16:06:57.060 INFO  - 120 source files to be analyzed
16:06:59.101 INFO  - 120/120 source files analyzed
16:06:59.491 INFO  - Sensor JavaScriptSquidSensor done: 2500 ms
16:06:59.491 INFO  - Sensor CpdSensor...
16:06:59.492 INFO  - SonarBridgeEngine is used for js
16:06:59.498 INFO  - Cross-project analysis disabled
16:07:01.143 INFO  - Sensor CpdSensor done: 1652 ms
16:07:01.143 INFO  - Sensor InitialOpenIssuesSensor...
16:07:01.179 INFO  - Sensor InitialOpenIssuesSensor done: 36 ms
16:07:01.179 INFO  - Sensor ProjectLinksSensor...
16:07:01.186 INFO  - Sensor ProjectLinksSensor done: 7 ms
16:07:01.188 INFO  - Sensor VersionEventsSensor...
16:07:01.196 INFO  - Sensor VersionEventsSensor done: 8 ms
16:07:01.196 INFO  - Sensor FileHashSensor...
16:07:01.203 INFO  - Sensor FileHashSensor done: 7 ms
16:07:01.396 INFO  - Execute decorators...
16:07:02.346 INFO  - Store results in database
16:07:05.655 INFO  - ANALYSIS SUCCESSFUL, you can browse http://localhost:9000/dashboard/index/Enyo
16:07:05.706 INFO  - Executing post-job class org.sonar.plugins.core.issue.notification.SendIssueNotificationsPostJob
16:07:05.774 INFO  - Executing post-job class org.sonar.plugins.core.batch.IndexProjectPostJob
16:07:06.051 INFO  - Executing post-job class org.sonar.plugins.dbcleaner.ProjectPurgePostJob
16:07:06.060 INFO  - -> Keep one snapshot per day between 2014-07-09 and 2014-08-05
16:07:06.061 INFO  - -> Keep one snapshot per week between 2013-08-07 and 2014-07-09
16:07:06.062 INFO  - -> Keep one snapshot per month between 2009-08-12 and 2013-08-07
16:07:06.065 INFO  - -> Delete data prior to: 2009-08-12
16:07:06.069 INFO  - -> Clean Enyo [id=33]
INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
Total time: 38.279s
Final Memory: 11M/111M
INFO: ------------------------------------------------------------------------

분석이 정상적으로 완료되면 SonarQube에서 분석결과를 확인할 수 있습니다.

댓글()

SonarQube 설치 및 설정

DevOps|2014. 8. 5. 22:23

MySQL Database

설치

MySQL 다운로드 페이지에서 설치 파일을 받아서 설치하거나, 아래 링크의 글에서 MySQL 설치 절을 참고하여 MySQL을 설치합니다.

MySQL 5.0.45 원하는 위치에 수동 설치 및 윈도 서비스로 등록 하기

여기에서는 윗 글을 참고하여 수동 설치 했으며, 오래된 5.0.45 버전 대신 5.1 대의 최신 버전인 5.1.73 버전을 사용했습니다.

설정

SonarQube 설치 문서에서 InnoDB 사용을 권장하고 있기 때문에 my.ini 파일의 [mysqld] 옵션을 아래와 같이 수정했습니다.

query_cache_type, query_cache_size 옵션을 추가했고, innodb 관련 옵션(innodb_*)은 값을 수정한 부분이 많습니다.

innodb_data_home_dir, innodb_log_group_home_dir 경로는 본인의 설치 경로에 맞게 수정해 주세요.

[mysqld]
port        = 3306
socket      = MySQL
skip-locking
key_buffer_size = 16K
max_allowed_packet = 1M
table_open_cache = 4
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 128K
query_cache_type = 1
query_cache_size = 32M

# Don't listen on a TCP/IP port at all. This can be a security enhancement,
# if all processes that need to connect to mysqld run on the same host.
# All interaction with mysqld must be made via Unix sockets or named pipes.
# Note that using this option without enabling named pipes on Windows
# (using the "enable-named-pipe" option) will render mysqld useless!
# 
#skip-networking
server-id   = 1

# Uncomment the following if you want to log updates
#log-bin=mysql-bin

# binary logging format - mixed recommended
#binlog_format=mixed

# Uncomment the following if you are using InnoDB tables
innodb_data_home_dir = D:\\dev\\tool\\mysql\\data\\
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = D:\\dev\\tool\\mysql\\data\\
# You can set .._buffer_pool_size up to 50 - 80 %
# of RAM but beware of setting memory usage too high
innodb_buffer_pool_size = 32M
innodb_additional_mem_pool_size = 2M
# Set .._log_file_size to 25 % of buffer pool size
innodb_log_file_size = 5M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50

이제 명령 프롬프트를 하나 띄우고 database 스크립트 파일을 다운로드 받은 후 실행합니다.

D:\dev\tool\mysql\bin> mysql -u root -p < create_database.sql

sonar라는 이름의 Database와 사용자가 MySQL에 생성돼 있으면 스크립트가 잘 실행된 겁니다.

SonarQube

다운로드

아래 링크에서 SonarQube 4.4 버전을 다운로드 받아서 설치합니다. 만약 4.4 버전이 보이지 않으면 “Show all versions” 링크를 누르면 이전 버전이 보입니다.

http://www.sonarqube.org/downloads/

원하는 곳에 다운로드 받은 압축파일을 해제하면 설치는 완료입니다.

설정

SonarQube 설치 디렉토리 하위의 conf 디렉토리에 있는 sonar.properties 파일을 텍스트에디터로 엽니다. 아래와 같이 H2 database 관련 sonar.jdbc.url은 주석 처리하고, MySQL database 쪽의 주석은 없앱니다.

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

# directory containing H2 database files. By default it's the /data directory in the SonarQube installation.
#sonar.embeddedDatabase.dataDir=
# H2 embedded database server listening port, defaults to 9092
#sonar.embeddedDatabase.port=9092


#----- MySQL 5.x
# Comment the embedded database and uncomment the following line to use MySQL
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true

실행

SonarQube 설치 디렉토리 하위의 bin 디렉토리에는 각 플랫폼 별로 디렉토리가 구분되어 있습니다. 각자의 플랫폼에 맞는 디렉토리에 있는 실행파일로 SonarQube를 실행할 수 있습니다.

저는 Win32라서 [설치 디렉토리]\bin\windows-x86-32\StartSonar.bat 파일로 실행할 수 있었습니다.

MySQL을 먼저 실행한 후 SonarQube를 실행합니다. SonarQube 콘솔 창에 다음과 같이 웹서버가 시작되었다는 메시지가 나온 후, 브라우저에서 http://localhost:9000/에 접속하면 SonarCube Dashboards를 볼 수 있습니다.

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    | 2014.08.05 13:58:09 INFO  Web server is started

이제 관리자 계정(admin/admin)으로 로그인한 후 플러그인 설치 등의 작업을 진행하면 됩니다.

댓글()

Enyo 기반 webOS TV 앱 개발 팁

JavaScript|2014. 8. 4. 18:29

댓글()

webOS TV SDK 설치 방법

JavaScript|2014. 7. 29. 00:00

댓글()

이클립스 - JavaScript Validation 중지

Developer Tools|2013. 4. 16. 16:01

Project > Properties > Builders

Javascript Validator 항목을 unckeck


댓글()

이클립스 - jQuery Syntax 오류 제거

Developer Tools|2013. 3. 7. 13:48

이클립스에서 jQuery 등의 외부 라이브러리에 대한 Syntax 오류가 발생하는게 거슬리면, 다음과 같이 제외 대상으로 등록한다.


해당 프로젝트명을 우클릭한 다음 Properties 메뉴를 선택하여 설정창을 띄운 후, JavaScript -> Include Path 메뉴의 Source 탭으로 이동한다.


Source 탭에 나오는 여러 소스 폴더 중에서 제외할 js 파일이 속한 폴더를 펼친 후에, Excluded 항목을 선택한다.

Exclusion patterns 영역의 오른쪽에 있는 Add 버튼을 누른 후 제외할 js 파일을 선택한다.



댓글()

java.lang.ClassFormatError - 이클립스에서 JUnit 테스트 실행시 발생

기타|2012. 6. 4. 13:43

java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/servlet/ServletOutputStream

Maven dependency에 아래와 같이 javaee-web-api가 설정되어 있을 때 발생함

<dependency>  
   <groupId>javax</groupId>  
   <artifactId>javaee-web-api</artifactId>  
   <version>6.0</version>  
   <scope>provided</scope>  
</dependency>

아래와 같이 tomcat-servlet-api로 대체하면 오류가 사라진다.

<dependency>  
   <groupId>org.apache.tomcat</groupId>  
   <artifactId>tomcat-servlet-api</artifactId>  
   <version>7.0.8</version>  
   <scope>provided</scope>  
</dependency>

참고링크

http://www.oracle.com/technetwork/articles/java/unittesting-455385.html

The standard Java EE 6 APIs in the Maven repository were processed by a tool, which removes the method body implementation from the bytecode and makes the javaee-web-api dependency unusable for unit testing.

댓글()

git submodule update --init 실패 시 복구

Developer Tools|2012. 5. 27. 15:20

$ git submodule update —init

.

.

No submodule mapping found in .gitmodules for path ‘bundle/vim-colors-solarized’

$ git submodule

$ git submodule add git://github.com/altercation/vim-colors-solarized.git bundle/vim-colors-solarized

‘bundle/vim-colors-solarized’ already exists in the index


$ git rm —cached bundle/vim-colors-solarized

$ rm bundle/vim-colors-solarized/

$ git submodule add git://github.com/altercation/vim-colors-solarized.git bundle/vim-colors-solarized

$ git submodule update —init

댓글()

npm 패키지 전역 모드 설치

Developer Tools|2012. 5. 27. 15:17

use –global option

$ npm install –global zombie
zombie@0.12.13 /home/repatterns/node/0.6.8/lib/node_modules/zombie

$ which node
/home/repatterns/node/0.6.8/bin/node

set global=true

npm set global=true



댓글()

ProGuard를 Maven 프로젝트에 적용할 때 유의할점

Developer Tools|2012. 5. 27. 15:15

'can’t find referenced class org.apache.commons.logging.Log'


proguard-maven-plugin 적용 시에 위와 같은 Warning 메시지가 나오면, 해당 클래스가 속한 라이브러리의 scope를 compile로 지정한 후 다시 시도해 본다.


<dependency>

    <groupId>org.slf4j</groupId>

    <artifactId>jcl-over-slf4j</artifactId>

    <version>1.6.1</version>

    <scope>compile</scope>

</dependency>


댓글()

넷빈즈 antialias 설정

Developer Tools|2012. 5. 27. 15:13

$NETBEANS_HOME/etc/netbeans.conf 파일을 연 후에 다음과 같이 뒷부분에 " -J-Dawt.useSystemAAFontSettings=on"을 추가한다. netbeans_default_options="-J-client -J-Xss2m -J-Xms32m -J-XX:PermSize=32m -J-XX:MaxPermSize=384m -J-Dapple.laf.useScreenMenuBar=true -J-Dapple.awt.graphics.UseQuartz=true -J-Dsun.java2d.noddraw=true -J-Dawt.useSystemAAFontSettings=on"

댓글()

사용자가 다운로드하는 파일을 기본 프로그램으로 열 수 없습니다

기타|2012. 5. 27. 15:12

“사용자가 다운로드하는 파일을 기본 프로그램으로 열 수 없습니다”

 

Internet Explorer에서 pdf 등의 연결된 프로그램을 열 때 위와 같은 오류 메시지가 발생하는 경우에는,

다음 글을 참고하여 레지스트리를 수정한 후에 다시 시도해본다.

 

http://support.microsoft.com/kb/925832/ko


——

 

발생 상황

 

Content-Disposition: inline; filename=”49573868-c5d1-43b5-8b71-cee0501e8c06.pdf”;

Content-Transfer-Encoding: binary

Content-Type: application/pdf;charset=UTF-8

Content-Language: ko

Content-Length: 32419

 

Content-Disposition 헤더 값이 inline으로 지정되고, Content-Type이 application/pdf로 응답이 왔지만,

다운로드 다이어로그가 뜨면서 위의 경고 메시지가 출력되었음.

댓글()