Translate

2016년 12월 9일 금요일

[JAVA] Received fatal alert: handshake_failure 오류




증상

1. HttpClient 를 이용해 서버(Tomcat)에 HTTPS 프로토콜 요청 및 응답 받는 로직
2. Tomcat 의 버전 6.0.36 => 6.0.45 업그레이드 시 오류가 발생





분석

try..catch 구문에서는 "IOException", "peer not authenticated" 라는 메시지가 나오며 통신오류가 발생했다.
1004lucifer
아래는 "java -Djavax.net.debug=all" 옵션을 이용해 디테일한 로그를 추출했다.


http-bio-9002-exec-7, setSoTimeout(20000) called
Allow unsafe renegotiation: false
Allow legacy hello messages: true
Is initial handshake: true
Is secure renegotiation: false
%% No cached client session
*** ClientHello, TLSv1
RandomCookie:  GMT: 1453345326 bytes = { 54, 203, 227, 17, 192, 221, 74, 47, 194, 163, 123, 78, 12, 6, 230, 251, 218, 209, 47, 176, 32, 80, 91, 7, 207, 75, 35, 68 }
Session ID:  {}
Cipher Suites: [SSL_RSA_WITH_RC4_128_MD5, SSL_RSA_WITH_RC4_128_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, SSL_RSA_WITH_DES_CBC_SHA, SSL_DHE_RSA_WITH_DES_CBC_SHA, SSL_DHE_DSS_WITH_DES_CBC_SHA, SSL_RSA_EXPORT_WITH_RC4_40_MD5, SSL_RSA_EXPORT_WITH_DES40_CBC_SHA, SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA, SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA, TLS_EMPTY_RENEGOTIATION_INFO_SCSV]
Compression Methods:  { 0 }
***
http-bio-9002-exec-7, WRITE: TLSv1 Handshake, length = 75
http-bio-9002-exec-7, WRITE: SSLv2 client hello message, length = 101
http-bio-9002-exec-7, READ: TLSv1 Alert, length = 2
http-bio-9002-exec-7, RECV TLSv1 ALERT:  fatal, handshake_failure
http-bio-9002-exec-7, called closeSocket()
http-bio-9002-exec-7, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
http-bio-9002-exec-7, IOException in getSession():  javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
http-bio-9002-exec-7, called close()
http-bio-9002-exec-7, called closeInternal(true)
16.08.02 16:22:22[DEBUG][-bio-9002-exec-7](DefaultClientConnection.java: 165) Connection closed
16.08.02 16:22:22[DEBUG][-bio-9002-exec-7](DefaultClientConnection.java: 152) Connection shut down
http-bio-9002-exec-7, called close()
http-bio-9002-exec-7, called closeInternal(true)
16.08.02 16:22:22[DEBUG][-bio-9002-exec-7](SingleClientConnManager.java: 267) Releasing connection org.apache.http.impl.conn.SingleClientConnManager$ConnAdapter@29a3fb76
javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
at com.sun.net.ssl.internal.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:352)
at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:128)
at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:397)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:148)
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149)
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:121)
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:573)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:425)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732)
at com.domain.api.openapi.service.OpenApiService.doService(OpenApiService.java:433)
at com.domain.api.openapi.controller.OpenApiController.openApi(OpenApiController.java:63)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
16.08.02 16:22:22[DEBUG][-bio-9002-exec-7](AbstractMessageConverterMethodProcessor.java: 139) Written [{"header":{"resResult":"0","resMessage":"인터페이스 처리중 오류가 발생하였습니다.","errorCode":"IOException","errorMessage":"peer not authenticated"}}] as "application/json;charset=UTF-8" using [org.springframework.http.converter.StringHttpMessageConverter@729f624a]
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
16.08.02 16:22:22[DEBUG][-bio-9002-exec-7](DispatcherServlet.java: 957) Null ModelAndView returned to DispatcherServlet with name 'open_api': assuming HandlerAdapter completed request handling
at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
16.08.02 16:22:22[DEBUG][-bio-9002-exec-7](FrameworkServlet.java: 913) Successfully completed request
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
16.08.02 16:22:22[DEBUG][-bio-9002-exec-7](AbstractBeanFactory.java: 245) Returning cached instance of singleton bean 'sqlSessionFactory'
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:436)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:662)






해결방안

JAVA 버전을 1.6에서 1.7로 업그레이드 후 해결됨.
1004lucifer
공식홈페이지에서 톰캣의 6.0.36 / 6.0.45 두개의 버전에 대해서 달라진 점을 확인했지만 현재의 이슈에 대한건 발견하지 못했다. ㅠ



====================
2018.11.27 추가

Java6의 jsse.jar 소스와 위의 로그를 확인 시 Client에서 handshake fail 관련 코드를 준 것으로 보여진다.
위의 문제를 해결하기 위해서는 Client의 로그도 같이 확인해 봐야 정확한 진단이 가능하다는 생각이 든다.


다만 Tomcat 버전이 올라가면서 취약한 암호화알고리즘(Cipher Suites)를 사용하지 않도록 설정이 되었고, Java6의 암호화알고리즘 키제한 이슈로 인해 Java7 업데이트 시 문제가 사라진게 아닐까 생각이 든다.

링크 - [Java] JDK의 암호화 알고리즘 키 제한 이슈 (Illegal key size 오류)
링크 - [Java][WAS] 특정 브라우저에서 HTTPS 접속 시 화면이 보이지 않는경우 (Cipher Suites 이슈)
====================



참고
http://docs.oracle.com/javase/6/docs/technotes/guides/security/jsse/ReadDebug.html
https://www.lesstif.com/pages/viewpage.action?pageId=29590407
http://stackoverflow.com/questions/30828759/thread-6-recv-tlsv1-alert-fatal-handshake-failure



2016년 12월 5일 월요일

[Outlook] 0x8004DF0B 오류가 발생하며 동기화 에러문제




SW version: Outlook 2010

mail: Google Gmail



증상

Google 회사 메일을 Outlook 연동하여 동기화 하려할 시 아래와 같이 나오며 정상적으로 동기화가 되지 않는다.
1004lucifer



'id@domain의 등록된 폴더를 동기화하는 중입니다.' 작업에서 다음 오류(0x8004DF0B)가 발생했습니다 : 'id@domain의 등록된 폴더를 동기화할 수 없습니다. 오류: 서버에 연결할 수 없습니다. 이 작업을 완료하려면 Outlook이 온라인 상태이거나 연결 상태가 '연결됨'이어야 합니다. 이 메시지가 계속 표시되면 서버 관리자 또는 인터넷 서비스 공급자(ISP)에게 문의하십시오.'






원인 및 해결방법

이상하게도 gmail.com 의 메일은 정상적으로 Outlook 에서 동기화가 되는데 회사메일 회사도메인의 gmail 은 위와같은 증상이 발생을 한다.
1004lucifer
정확한 정보가 나와있는 웹페이지를 볼수는 없었지만 Outlook 2010의 경우에는 예전 보안 프로토콜을 사용하기 때문에 구글의 '보안 수준이 낮은 앱의 액세스'를 활성화 시켜줘야 한다고 한다.

아래의 링크에서 '보안 수준이 낮은 앱의 액세스' 를 활성화 시킬 수 있다.
https://www.google.com/settings/security/lesssecureapps


위의 옵션을 활성화 시킨 후 Outlook 을 켜면 당장은 안될 수 있지만 시간이 지나고나서 동기화가 된다.





PS.
오랜시간 뒤에 컴퓨터를 재부팅 하거나 Outlook을 껐다가 다시켜면 또 위와같은 문제가 발생하는 경우가 있는데 '보안 수준이 낮은 앱의 액세스'를 비활성 했다가 다시 활성화 후 Outlook 을 켜면 된다.
1004lucifer
왜 구글 기업메일만 문제가 발생을 하는지는 모르겠다.



2016년 9월 18일 일요일

[Gradle] build.gradle 파일의 주석이 적용되지 않는문제





환경


lucifer@lucifer-Vostro-V13:~$ gradle --version

------------------------------------------------------------
Gradle 2.13
------------------------------------------------------------

Build time:   2016-04-25 04:10:10 UTC
Build number: none
Revision:     3b427b1481e46232107303c90be7b05079b05b1c

Groovy:       2.4.4
Ant:          Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM:          1.8.0_77 (Oracle Corporation 25.77-b03)
OS:           Linux 4.2.0-42-generic amd64

lucifer@lucifer-Vostro-V13:~$






증상

아래에서 설정한 spring security 의 문법과 공백이 있는 주석이 정상적으로 작동되지 않는다.
(dependency 가 적용되면 안되는데 적용이 되어버린다.)
1004lucifer
dependencies {
// compile('org.springframework.boot:spring-boot-starter-security')
 compile('org.springframework.boot:spring-boot-starter-thymeleaf')
 compile('org.springframework.boot:spring-boot-starter-web')
 runtime('mysql:mysql-connector-java')
 testCompile('org.springframework.boot:spring-boot-starter-test')
}




해결방법

주석문과 문법과 공백이 없이 붙여야 한다.
(아마 gradle 버그일 것으로 예상이 된다. 이후버전에는 잘 되지 않을까..)
1004lucifer
dependencies {
 //compile('org.springframework.boot:spring-boot-starter-security')
 compile('org.springframework.boot:spring-boot-starter-thymeleaf')
 compile('org.springframework.boot:spring-boot-starter-web')
 runtime('mysql:mysql-connector-java')
 testCompile('org.springframework.boot:spring-boot-starter-test')
}




PS.
Spring Boot 를 이용해 security를 포함했다가 임시로 security 를 취소(삭제)하려 했는데 잘 되지 않아서 보니 gradle 문제라니;;



2016년 8월 14일 일요일

[네이버지도] '지적편집도/지적도'(부동산 투자계획) 이용 방법




최근 부동산에 관심이 있어 공부하다보니 네이버지도에 '지적편집도' 라는 기능이 있는 것을 알게 되었다.
평소 네이버 지도를 자주 애용하는 편인데 관심이 없어서인지 메뉴한번 눌러보고 해당 기능이 어떤 정보를 알려주는지 제대로 확인을 해본적이 없었다.
오늘에서야 '지적편집도' 기능에서 어떠한 정보를 제공하는지 확인을 해보았다.



'지적도' 의 정의

토지의 소재(所在), 지번(地番), 지목(地目), 경계(境界) 따위를 나타내기 위하여 국가에서 만든 평면 지도.
- 출처: 네이버 사전(링크)




네이버지도의 '지적편집도' 사용방법

1. 네이버지도에서 오른쪽의 '지적편집도' 메뉴를 누르게되면 지도의 모습이 '지적편집도' 모드로 변경되어 보여진다.



2. 아래의 모습은 '인천 서구'의 '지적편집도' 모드로 본 모습이다.
(지역의 크기, 그리고 여러가지 색깔의 구분과 점선이 보여지는 것을 알 수 있다.)



3. '지적편집도' 모드의 색상 및 점선의 의미는 왼쪽 하단의 '지도범례' 링크를 누르면 확인이 가능하다.




'지도범례' 클릭 시 아래와 같이 지도가 표시하고 있는게 어떠한 정보인지 알 수 있다.

1. 일반

2. 교통교통 

3. 자전거 

4. 날씨


5. 지적편집도
(부동산투자를 하는 사람에게 유용한 정보가 아닐까 싶다.)















'지적편집도' 사용방법을 알아봤으니 이번에는 지도에 실제로 어떻게 표시 되었는지 확인을 해보았다.
1004lucifer, 지적편집도, 지적도, 부동산, 투자
- '인천 서구'
  1) '공사중지하철' 표시가 있는 것을 볼 수 있다.
     (최근에 개통을 했지만 아직 네이버지도에는 반영되지 않은 것 같다. 링크)



- 지도를 축소해보면 아래와 같은 여러가지 국토사업 정보를 볼 수 있다.
  1) 도로철도
    - 강화 간성간고속 (링크)
    - 고촌 월곶간고속 (링크)
    - 김포도시철도 (링크)
  2) 국토계획
    - 청라국제도시 (링크)
    - 등등..






PS.
지도의 확대/축소를 하면서 관심있는 지역을 살펴보아야 해당 지역의 국토개발계획을 알 수 있으며 해당 국토개발이 예정인 점을 감안하면 실제로 실현이 가능한지 생각해 볼 필요가 있다.


2016년 7월 29일 금요일

[Linux] 파일내용 확인 시 vi 보다는 less 를 사용하자





리눅스/유닉스 환경에서 파일의 내용을 확인 시 vi 를 많이들 사용한다.

인터넷을 봐도 파일을 편집할 때 vi 를 이용해 편집하라고 많이 기술되어 있는 것도 vi 를 좀더 자주 사용하게되는 이유가 아닐까 싶다.


제목에서 vi 보다는 less 를 사용하자고 적은 이유는 less 가 vi 보다 기능이 많거나 더 좋아서 사용하자고 이야기하는게 아니다.
1004lucifer
vi 와 less 의 사용 용도가 다르기 때문이다.

vi : 파일 편집 시 사용
less : 파일 내용 확인 시 사용





vi 를 사용해도 괜찮지만 vi 가 가지는 불편함이 있다.


vi 를 이용해 파일을 열게되면 해당 파일의 용량만큼 vi 프로그램이 파일을 모두 읽어들여 메모리를 차지하게된다.
즉 3기가짜리 파일을 vi 로 열게되면 3기가를 모두 로드해서 메모리에 올리기 때문에 시간도 오래걸리고 OS의 메모리가 부족하게되어 디스크 스왑이 일어날 수 있게된다.




그에반해 less의 경우에는


랜덤엑세스 방식으로 파일을 읽기 때문에 명령어 입력 시 파일이 즉시 열리게 된다.
그리고 메모리 사용량이 높지도 않다.





사용방법은 vi 와 비슷하며 아래와 같이 입력 하면 해당 파일이 열린다.


 ~]$ less 파일명




내가 자주 사용하는 커맨드는 아래와 같다. (파일을 연상태에서 입력)
대부분 vi 와 커맨드가 같다.
1004lucifer

 -N : 라인넘버를 보여줌
 -n : 라인넘버를 숨김
 f : 다음 페이지 이동
 b : 이전 페이지 이동
 d : 다음 절반 페이지 이동
 u : 이전 절반 페이지 이동
 /문자열 : 해당 문자열 검색
 n : 문자열 다음 검색
 N : 문자열 이전 검색
 숫자 : 해당 라인으로 이동





어떤 특정 문자열을 뽑기 위해서는 cat 과 grep 명령어를 이용해 뽑아내긴 하지만 특정 문자열의 앞뒤를 대략적으로 살펴보기 위해서는 파일을 열어서 봐야한다.

그런경우에 나는 빠르고 실용적인 less 명령어를 추천한다.  :)



2016년 7월 27일 수요일

[SQL Developer] SQL 파일을 빠르게 수행하는 방법





최근에 30만건이 넘는 insert Query 를 돌려야 하는 상황이 발생을 했다.


옛날에는 몇천건 되는 sql 파일을 그냥 열고서 F5를 누르고 구동되면서 하염없이 떨어지는 쿼리들을 보곤 했는데..
1004lucifer
아무래도 sql파일을 통채로 돌리는게 있지 않을까 싶어 찾아보니 있었다.





1. 현재의 세션이 autocommit 상태인지 체크를 한다.


 - show autocommit;  <== 현재의 상태를 체크한다.
 - set autocommit off; <== autocommit off 설정
 - set autocommit on; <== autocommit on 설정

autocommit on 상태인경우 프로그램이 종료되거나 PC가 종료가 되더라도 롤백이 되지 않지만 속도가 많이 느려진다.
가급적 autocommit off 상태로 작업을 권장한다.







2. @path\scriptfile.sql 형식으로 sql 파일의 경로를 입력 후 실행한다.
1004lucifer

ex) sql 파일이 c드라이브의 test.sql 파일인경우
 - @c:\test.sql


ex) 테스트용으로 사용한 test.sql 파일의 내용은 아래와 같다.
====================
select 1 from dual;
select 1 from dual;
select 1 from dual;

commit;
====================

시작 시 autocommit off 로 시작하는 환경에 파일 마지막에 commit; 을 붙여주지 않으면 작업자가 직접 'commit' 버튼을 눌러줘야 한다.
commit 버튼을 누르지 않으면 해당 테이블에 락이 걸리므로 꼭 파일 마지막에 commit; 문자열을 집어넣어준다.







장점

SQL Developer 에서 sql파일을 열어서 F5로 해당 쿼리들을 실행 시 프로그램이 메모리도 많이 잡아먹을 뿐 아니라 점점 시간이 지날수록 작업시간이 느려진다.

위의 방법으로 작업 시 원격의 DB서버에 30만건 이상의 insert 구문을 수행하는데 약 100분 정도가 걸렸다.   :)





참고
http://stackoverflow.com/questions/31560367/how-to-run-sql-file-in-oracle-sql-developer-tool-to-import-database


2016년 7월 11일 월요일

[Web] UTF-8 의 BOM 유무에 따른 한글깨짐 이슈




BOM에 대한 기본적인 정보는 위키백과(링크)를 참조하기 바란다.
(개인블로그 이긴 하지만 링크 의 경우에도 잘 정리되어 있다.)


예제파일
1. BOM file: 다운로드 링크
2. without BOM file: 다운로드 링크



도대체 BOM(Byte Order Mark) 가 어떠한 문제를 일으키는 걸까?
1004lucifer
BOM이 있는 파일은 일반적으로 문제가 되는 부분은 Linux/Unix 운영환경에서 많이 문제가 된다.
(AIX(IBM) 서버 환경에서 XML 파일에 BOM이 붙어있어서 애플리케이션이 실행이 되지 않았던 경험이 아직도 기억이 난다. 알고나면 별거 아니지만 참 고생하면서 찾았었다.)


이런 이기종 시스템에 문제가 생기지 않게 하기위해서는 BOM을 붙이지 않는게 일반적이었고 BOM을 붙이는 것에 대해서 직접적인 장점을 본적이 없었다.



최근에 BOM의 장점과 웹에 미치는 영향을 보게되어 이렇게 글을 작성한다.


증상

UTF-8 인코딩으로 된 JSON 파일을 웹서버(Apache, WebtoB etc..) 에 올려서 서비스를 하게 되었는데 웹에서 특정 파일의 한글문자가 깨지는 증상이 발생을 했다.
한글이 정상적으로 표시되는 파일은 BOM이 있었고, 한글이 깨지는 파일은 BOM이 없었다.




원인

아래의 두가지 원인이 있다. (첫번째는 BOM에 대한 직접적인 원인이 아니다.)
1. 서버에서 Response 할 시 헤더의 'Content-Type' 속성에 charset 값을 넣어주지 않는다.
2. BOM이 없으며 'Content-Type' 속성에 charset 값이 없는경우 UTF-8 인코딩으로 특별히 지정해 주지 않으면 클라이언트의 로케일(Locale) 설정을 따라간다.








원인에 대해서 분석과 해결방안을 확인해 보겠다.
(테스트는 apache-tomcat 7.0 으로 작업을 했다.)


1. 서버에서 Response 할 시 헤더의 'Content-Type' 값에 charset 값을 넣어주지 않는다.

분석
1004lucifer

1. JSP 파일의 경우 상단에
<%@ page language="java" contentType="application/json; charset=utf-8" pageEncoding="utf-8"%>
문자열을 입력 시 별다른 서버 작업 없이
Response 헤더에 Content-Type: application/json;charset=utf-8 값으로 내려오며 한글이 정상적으로 보여졌다.

2. txt, json 등등 jsp 가 아닌 다른 파일에 대해서는 위의 작업을 할 수 없다.



해결방안 (jsp 가 아닌 파일에 대해서)


1. WEB에서 서비스 하는경우 WEB 애플리케이션에 따라 설정해 준다.
 ex) Apache - .htaccess 파일 설정 (아래의 3개의 설정중에 취행대로 설정해 주면 된다.)
1. AddDefaultCharset utf-8
2. AddType 'application/json; charset=UTF-8' .json
3. AddCharset utf8 .json
apache 설정: 링크1, 링크2


2. WAS에서 서비스 하는경우 web.xml 파일에 아래와 같이 해당 확장자에 대해서 mime-type 을 지정해 준다.
<mime-mapping>
        <extension>json</extension>
        <mime-type>application/json; charset=utf-8</mime-type>
</mime-mapping>


PS.
WAS에서 서비스 하는경우 web.xml 을 사용하지 않는경우 해결을 할 수 없을 수 있다.
(WAS에서 web.xml 을 사용하지 않는경우는 여러가지 경우가 있을 수 있는데 Web 서버 없이 WAS 단독 구성으로 되어있는 상황에서 특정 디렉토리를 alias 걸어서 사용하면 web.xml 이 없는 상황이 되어버린다.)
  ex) Tomcat 에서는 web.xml 을 사용하지 않으면 방법이 없다.






2. BOM이 없으며'Content-Type' 속성에 charset 값이 없는경우 UTF-8 인코딩으로 특별히 지정해 주지 않으면 클라이언트의 로케일(Locale) 설정을 따라간다.

분석
1004lucifer

1. Windows OS에서 'Content-Type' 속성에 charset 값이 없을 때 BOM 있는 파일의 경우 한글이 정상적으로 표시되며, BOM 없는 파일의 경우 한글이 깨졌다.
(UTF-8 Locale을 사용하는 Ubuntu에서는 둘다 한글이 정상적으로 보여졌다.)

BOM 있는 파일






BOM 없는 파일






Android 핸드폰의 경우에도 BOM 없는 파일의 한글이 깨졌으나 아래와 같이 설정을 변경 후 새로고침을 하니 정상적으로 보여졌다.
* 브라우저 설정 => 고급 => 텍스트인코딩
(핸드폰에 따라 설정 방법이 조금 다를 수 있다.)







해결방안


1. 위와 같이 이미 만들어진 프로그램(브라우저 같은..)의 경우에는 다음과 같이 할 수 있다.
  1) 'Content-Type' 속성에 charset=utf-8 이 나올 수 있도록 서버 설정을 변경한다.
  2) 파일에 BOM 을 붙인다. (권장하지 않음.)

2. 프로그램을 직접 제작/수정 하는경우 HTTP프로토콜을 이용해 해당 Resource를 받아올 시 UTF-8 인코딩을 지정한다.
  1) HttpClient (apache) 라이브러리
    - 별다른 설정 없이 기본으로 UTF-8을 지원하는지 한글이 깨지지 않는다.
  2) Spring RestTemplate 라이브러리
    - StringHttpMessageConverter 객체를 아래와 같이 생성 해야 한다. 그렇지 않은경우 구동되는 시스템 Locale을 따라간다.
new StringHttpMessageConverter(Charset.forName("UTF-8"))






PS.
BOM에 대한 고찰

RFC4627(링크) 문서에 보면 JSON Text 는 유니코드로 인코딩 되어야 하며 Default 로 UTF-8 을 사용한다고 정의되어 있다.
그렇다는건 현재 사용되어지는 브라우저 또한 'Content-Type' 값이 'application/json' 으로만 지정되어 있어도 알아서 UTF-8 로 인코딩하여 정상적으로 보여줘야 한다고 생각한다.

현재 사용하는 Chrome 51.0 버전과 Android 5.0.2 단말기의 브라우저에서 알아서 UTF-8 로 파싱해서 보여주고 있지 않고 있다.





참고
http://blog.wystan.net/2007/08/18/bom-byte-order-mark-problem
http://stackoverflow.com/questions/477816/what-is-the-correct-json-content-type
http://serverfault.com/questions/581760/how-do-i-set-proper-headers-for-json-in-apache
http://www.ietf.org/rfc/rfc4627.txt


2016년 7월 10일 일요일

[Ubuntu] WireShark - The capture session could not be initiated on interface 문제




OS: Ubuntu 15.10 Gnome



문제

WireShark 를 설치 후 인터페이스 선택하고 패킷 캡처를 하려는데 아래와 같은 문구가 나타나며 패킷캡처가 실행되지 않았다.
(root 권한으로 실행 시에는 문제가 없으며 일반계정으로 구동 시 문제가 발생한다.)

우분투,와이어샤크, 1004lucifer

The capture session could not be initiated on interface 'INTERFACE_NAME' (You don't have permission to capture on that device).

please check to make sure you have sufficient permissions, and that you have the proper interface or pipe specified.





해결방법
우분투,와이어샤크, 1004lucifer
실행 시 관리자 권한이 없어서 그러니 sticky bit 를 부여한다.
('ls -l' 명령어로 확인 시 s 권한이 붙어야 한다.)

lucifer@lucifer-Vostro-V13:~$ sudo chmod +s /usr/bin/dumpcap
lucifer@lucifer-Vostro-V13:~$ ls -l /usr/bin/dumpcap
-rwsr-sr-- 1 root wireshark 85632  8월 16  2015 /usr/bin/dumpcap



위의 작업 후 wireshark를 다시 실행하면 정상적으로 패킷 캡쳐가 되는 것을 확인 할 수 있다.



[Ubuntu] 우분투에서 WireShark 설치 방법



OS: Ubuntu 15.10 Gnome


아래와 같이 WireShark 설치를 했다.
(마지막 명령어로 /usr/bin/wireshark 경로에 설치가 되었음을 확인할 수 있다.)
와이어샤크, 1004lucifer

lucifer@lucifer-Vostro-V13:~$ sudo apt-get install wireshark
[sudo] password for lucifer: 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages were automatically installed and are no longer required:
  linux-image-4.2.0-16-generic linux-image-4.2.0-35-generic linux-image-4.2.0-36-generic linux-image-extra-4.2.0-16-generic
  linux-image-extra-4.2.0-35-generic linux-image-extra-4.2.0-36-generic
Use 'apt-get autoremove' to remove them.
The following extra packages will be installed:
  geoip-database-extra libjs-openlayers libsmi2ldbl libwireshark-data libwireshark5 libwiretap4 libwsutil4 wireshark-common
Suggested packages:
  snmp-mibs-downloader wireshark-doc
The following NEW packages will be installed:
  geoip-database-extra libjs-openlayers libsmi2ldbl libwireshark-data libwireshark5 libwiretap4 libwsutil4 wireshark wireshark-common
0 upgraded, 9 newly installed, 0 to remove and 3 not upgraded.
Need to get 23.6 MB of archives.
After this operation, 112 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
WARNING: The following packages cannot be authenticated!
  libsmi2ldbl geoip-database-extra libjs-openlayers libwireshark-data libwsutil4 libwiretap4 libwireshark5 wireshark-common wireshark
Install these packages without verification? [y/N] y
Get:1 http://kr.archive.ubuntu.com/ubuntu/ wily/main libsmi2ldbl amd64 0.4.8+dfsg2-9ubuntu3 [100 kB]
Get:2 http://kr.archive.ubuntu.com/ubuntu/ wily/universe geoip-database-extra all 20150810-1 [9,680 kB]
Get:3 http://kr.archive.ubuntu.com/ubuntu/ wily/universe libjs-openlayers all 2.13.1+ds2-1 [675 kB]
Get:4 http://kr.archive.ubuntu.com/ubuntu/ wily/universe libwireshark-data all 1.12.7+g7fc8978-1 [813 kB]
Get:5 http://kr.archive.ubuntu.com/ubuntu/ wily/universe libwsutil4 amd64 1.12.7+g7fc8978-1 [52.9 kB]
Get:6 http://kr.archive.ubuntu.com/ubuntu/ wily/universe libwiretap4 amd64 1.12.7+g7fc8978-1 [142 kB]
Get:7 http://kr.archive.ubuntu.com/ubuntu/ wily/universe libwireshark5 amd64 1.12.7+g7fc8978-1 [11.3 MB]
Get:8 http://kr.archive.ubuntu.com/ubuntu/ wily/universe wireshark-common amd64 1.12.7+g7fc8978-1 [144 kB]
Get:9 http://kr.archive.ubuntu.com/ubuntu/ wily/universe wireshark amd64 1.12.7+g7fc8978-1 [728 kB]
Fetched 23.6 MB in 4s (5,478 kB/s) 
Preconfiguring packages ...
Selecting previously unselected package libsmi2ldbl:amd64.
(Reading database ... 315073 files and directories currently installed.)
Preparing to unpack .../libsmi2ldbl_0.4.8+dfsg2-9ubuntu3_amd64.deb ...
Unpacking libsmi2ldbl:amd64 (0.4.8+dfsg2-9ubuntu3) ...
Selecting previously unselected package geoip-database-extra.
Preparing to unpack .../geoip-database-extra_20150810-1_all.deb ...
Unpacking geoip-database-extra (20150810-1) ...
Selecting previously unselected package libjs-openlayers.
Preparing to unpack .../libjs-openlayers_2.13.1+ds2-1_all.deb ...
Unpacking libjs-openlayers (2.13.1+ds2-1) ...
Selecting previously unselected package libwireshark-data.
Preparing to unpack .../libwireshark-data_1.12.7+g7fc8978-1_all.deb ...
Unpacking libwireshark-data (1.12.7+g7fc8978-1) ...
Selecting previously unselected package libwsutil4:amd64.
Preparing to unpack .../libwsutil4_1.12.7+g7fc8978-1_amd64.deb ...
Unpacking libwsutil4:amd64 (1.12.7+g7fc8978-1) ...
Selecting previously unselected package libwiretap4:amd64.
Preparing to unpack .../libwiretap4_1.12.7+g7fc8978-1_amd64.deb ...
Unpacking libwiretap4:amd64 (1.12.7+g7fc8978-1) ...
Selecting previously unselected package libwireshark5:amd64.
Preparing to unpack .../libwireshark5_1.12.7+g7fc8978-1_amd64.deb ...
Unpacking libwireshark5:amd64 (1.12.7+g7fc8978-1) ...
Selecting previously unselected package wireshark-common.
Preparing to unpack .../wireshark-common_1.12.7+g7fc8978-1_amd64.deb ...
Unpacking wireshark-common (1.12.7+g7fc8978-1) ...
Selecting previously unselected package wireshark.
Preparing to unpack .../wireshark_1.12.7+g7fc8978-1_amd64.deb ...
Unpacking wireshark (1.12.7+g7fc8978-1) ...
Processing triggers for hicolor-icon-theme (0.15-0ubuntu1) ...
Processing triggers for man-db (2.7.4-1) ...
Processing triggers for shared-mime-info (1.3-1) ...
Processing triggers for gnome-menus (3.13.3-6ubuntu1) ...
Processing triggers for desktop-file-utils (0.22-1ubuntu3) ...
Processing triggers for mime-support (3.58ubuntu1) ...
Setting up libsmi2ldbl:amd64 (0.4.8+dfsg2-9ubuntu3) ...
Setting up geoip-database-extra (20150810-1) ...
Setting up libjs-openlayers (2.13.1+ds2-1) ...
Setting up libwireshark-data (1.12.7+g7fc8978-1) ...
Setting up libwsutil4:amd64 (1.12.7+g7fc8978-1) ...
Setting up libwiretap4:amd64 (1.12.7+g7fc8978-1) ...
Setting up libwireshark5:amd64 (1.12.7+g7fc8978-1) ...
Setting up wireshark-common (1.12.7+g7fc8978-1) ...
Setting up wireshark (1.12.7+g7fc8978-1) ...
Processing triggers for libc-bin (2.21-0ubuntu4.3) ...
lucifer@lucifer-Vostro-V13:~$ type wireshark 
wireshark is /usr/bin/wireshark
lucifer@lucifer-Vostro-V13:~$






설치 중 아래와 같은 화면이 보이게 된다.


위의 화면에서 'Yes' 를 누르면 설치는 끝나게 되고 앞으로 아래의 명령어와 같이 root 권한으로 wireshark 를 구동할 수 있다.
와이어샤크, 1004lucifer
(가장 간편한 방법이며, 'No' 를 선택했더라도 별다른 설정없이 아래의 명령어로 root 권한으로 바로 실행이 가능하다.)
 $ sudo wireshark





만일 평소 root 권한이 아닌 평소 로그인 계정으로 실행하고 싶다면 'No'를 선택 후 아래와 같이 작업을 해줘야 한다.

설정방법
(YOUR_USER_NAME 부분은 본인이 접속해 있는 계정명)
$ sudo addgroup -system wireshark
$ sudo chown root:wireshark /usr/bin/dumpcap
$ sudo setcap cap_net_raw,cap_net_admin=eip /usr/bin/dumpcap
$ sudo usermod -a -G wireshark YOUR_USER_NAME




나의 경우에는 아래와 같이 작업을 했다.


# wireshark 설치시에 자동으로 추가가 되어있었나 보다.
lucifer@lucifer-Vostro-V13:~$ sudo addgroup -system wireshark
addgroup: The group `wireshark' already exists as a system group. Exiting.
lucifer@lucifer-Vostro-V13:~$ cat /etc/group | tail -3
sambashare:x:130:lucifer
vboxusers:x:131:
wireshark:x:132:

# dumpcap 파일의 소유권도 설치 시 자동으로 변경해 준것 같다.
lucifer@lucifer-Vostro-V13:~$ ls -l /usr/bin/dumpcap
-rwxr-xr-- 1 root wireshark 85632  8월 16  2015 /usr/bin/dumpcap

# 이건 확인방법을 몰라서 그냥 한번 해줬다.
lucifer@lucifer-Vostro-V13:~$ sudo setcap cap_net_raw,cap_net_admin=eip /usr/bin/dumpcap

# 내 계정(lucifer)을 wireshark 그룹에 추가한다.
lucifer@lucifer-Vostro-V13:~$ sudo usermod -a -G wireshark lucifer
lucifer@lucifer-Vostro-V13:~$ cat /etc/group | tail -3
sambashare:x:130:lucifer
vboxusers:x:131:
wireshark:x:132:lucifer

lucifer@lucifer-Vostro-V13:~$






PS.

위의 작업을 했는데도 사용자 계정으로 wireshark 를 구동 시 인터페이스가 인식되지 못했다.
(root 계정으로 실행 시 문제없이 인터페이스가 인식되었다.)

(Couldn't run /usr/bin/dumpcap in child process: Permission denied)


원인분석을 해봤다.

lucifer@lucifer-Vostro-V13:~$ 
lucifer@lucifer-Vostro-V13:~$ ls -l /usr/bin/dumpcap
-rwxr-xr-- 1 root wireshark 85632  8월 16  2015 /usr/bin/dumpcap
lucifer@lucifer-Vostro-V13:~$ 
lucifer@lucifer-Vostro-V13:~$ whoami
lucifer
lucifer@lucifer-Vostro-V13:~$ 
lucifer@lucifer-Vostro-V13:~$ cat /etc/group | tail -2
vboxusers:x:131:
wireshark:x:132:lucifer
lucifer@lucifer-Vostro-V13:~$ 
lucifer@lucifer-Vostro-V13:~$ /usr/bin/dumpcap
bash: /usr/bin/dumpcap: Permission denied
lucifer@lucifer-Vostro-V13:~$


위의 상황대로라면 내계정(lucifer)은 wireshark 그룹에 들어있으니 /usr/bin/dumpcap 을 실행시킬 권한이 있음에도 불구하고 권한이 없다고 답변한다.

환경설정을 다시 로드 하기도 해보고 이것 저것 해봐도 안되길래 재부팅을 해보니 아무일 없다는 듯이 정상적으로 인터페이스가 추가된 것을 확인 할 수 있다.

* 위의 작업이 끝나고 아래의 링크의 작업을 추가로 해줘야 한다.
[Ubuntu] WireShark - The capture session could not be initiated on interface 문제







마음의 소리 - 다음엔 이런작업 안하고 root로 실행해서 사용해야겠다.

참고 링크
https://ask.wireshark.org/questions/7523/ubuntu-machine-no-interfaces-listed
http://blog.munilive.com/ubuntu-14-04-wireshark-no-interfaces-available/



2016년 6월 25일 토요일

[JAVA] SVN 소스와 배포버전 소스가 일치하지 않는경우 소스 쉽게 맞추기 (소스 현행화 방법)





요즘에 젠킨스같은 CI 툴을 이용하면서 SVN에 커밋되어있는 소스와
실제 운영서버에 배포되어있는 소스가 동일한것이 당연하게 되었는데..



예전에는 종종 누군가 개발한 것을 운영서버에 배포하고 SVN에 커밋하지 않아서 SVN의 소스와 운영서버에 배포되어있는 소스가 불일치 하는 경우가 종종 있었다.
(개발한 당사자의 소스가 가장 최신버전의 소스가 되어버리는 상황인데 당사자가 퇴사하거나 해당 PC를 포멧해 버린다면 답이 없다;;)




위와같은 상황에서 할 수 있는 것은 서버에 올라가 있는 class 파일을 디컴파일 하여 java 소스와 일일히 비교해 보는건데 여간 고역이 아닐 수 없다.
그나마 비교해야 하는 파일이 몇개 정도라면 그냥 하면 되지만
소스가 불일치 하는 파일이 어떤건지 모르는 상황이라면 모든 소스를 일일히 비교해 보는 수 밖에 없다.



class파일을 디컴파일 하여 java 소스와 비교할 때 힘든점은 같은 소스라도 내용이 바뀔 수 있기 때문에 힘든게 아닐까 싶다.
java compiler가 java를 컴파일 시 소스 최적화를 하는데 이 때문에 소스가 미묘하게 바뀌거나 상황에 따라 완전 다른소스처럼 바뀌어 버린다.




최근에 인수인계를 해주고 떠난 이전 작업자가 소스를 SVN에 제대로 커밋하지 않는 바람에 프로젝트의 모든 소스를 디컴파일하여 소스를 맞추는 작업을 하게 되었다.
어떻게 작업을 할까 하다가 기막힌 방법이 떠올라 예상보다 적은 공수로 작업을 할 수가 있었다.


방법은 간단한데 아래와 같이 작업을 했다.

1004lucifer

1. (운영서버에)배포된 class를 모두 디컴파일 한다.
2. SVN의 소스를 내려받아 프로젝트 셋팅 후 빌드한다. (배포버전과 java 버전을 맞추는게 좋다.)
3. 빌드 후 생성된 class 파일을 디컴파일 한다.
4. 1번에서 디컴파일한 소스와 3번에서 디컴파일한 소스를 비교한다.





예를 들면 아래와 같다.
1004lucifer
샘플소스( 링크 , 다운로드 )

기존의 소스에서 아래 하이라이트 된 부분을 수정했다.
public synchronized Queueable dequeue(final int index) {
  if (index < 1 || index > this.size) {
    // throw new NoSuchElementException();
    return null;
  }

  final Queueable result = this.elements[index];
  setElement(index, this.elements[this.size]);
  this.elements[this.size] = null;
  this.size--;
  if (this.size != 0 && index <= this.size) {
    int compareToParent = 0;
    if (index > 1) {
      if (compareToParent == 0) {
        compareToParent = compare(this.elements[index], this.elements[index / 2]);
      } else {
        for (int i = 0; i < this.size; i++) {
          compareToParent++;
        }
        return result;
      }
    }
    if (index > 1 && compareToParent < 0) {
      percolateUpMinHeap(index);
    } else {
      percolateDownMinHeap(index);
    }
  }

  return result;
}



위의 방법으로 두개의 디컴파일된 소스를 비교해보면 이렇게 나온다.
(왼쪽의 모습이 위의 수정된 소스이다. 컴파일 시 소스최적화가 되어 다른 소스처럼 보여지게 된다.)
1004lucifer



작업의 공수를 낮춰주는 부분은 배포버전의 소스와 현재 SVN 소스의 어느부분이 다른지 한눈에 볼 수가 있다는 점이다.
(원본소스와 컴파일된 소스가 완전 다른 소스같이 보여지긴 하나 해당 부분만 꼼꼼히 보면 된다는 장점이 생겼다.)



위와같이 작업하여 운영서버에 배포된 class파일에서 현재 SVN 소스에 반영해야 할 파일들을 쉽게 추릴 수 있었고 어느 부분만 작업을 하면 되는지 알 수가 있어서 예상했던 공수를 많이 줄일 수 있었다.
서버에 반영된 소스가 SVN에 커밋되지 않은 상황이라는게 일어나서는 안되는 일이지만 만일 발생한 경우라면 위와같은 방법으로 소스현행화를 적응 공수를 들이며 작업이 가능 할 것이다.





PS.
나의 경우에는 IntelliJ의 디컴파일 기능을 이용했는데 따로 디컴파일 작업 없이 class를 실시간 디컴파일해서 보여준다. eclipse 역시 비슷한 플러그인이 있지 않을까 싶다.아래와 같이 기존의 class를 classes_origin 이라는 디렉토리로 넣어서 빌드된 class와 파일비교를 해서 확인했다.





CVS, GIT 등등 다른 버전관리 프로그램 또한 마찬가지고 버전관리를 사용하고 있지 않다고해도 위의 방법은 마찬가지로 유효하다.


2016년 6월 16일 목요일

[APK Studio] 프로그램 구동 시 libicui18n.so.52 에러 해결방법




OS: Ubuntu 15.10 gnome (x64)





증상


APK Studio 프로그램을 설치 후 구동하려 할 시 아래와 같이 에러메시지가 발생했다.
1004lucifer

lucifer@lucifer-Vostro-V13:/devTools/apkstudio-d49d3de$ ./apkstudio.sh
/devTools/apkstudio-d49d3de/./apkstudio: error while loading shared libraries: libicui18n.so.52: cannot open shared object file: No such file or directory
lucifer@lucifer-Vostro-V13:/devTools/apkstudio-d49d3de$






해결방법

libicui18n.so.52 라이브러리가 없어서 에러가 발생했다고 하니 libicui18n.so.52 라이브러리를 설치해 주자.
1004lucifer
1. libicui18n.so.52 라이브러리를 다운받는다.
공식: http://packages.ubuntu.com/trusty/amd64/libicu52/download
(링크가 변경될 수 있을까 싶어 개인공간에 올렸다. => Direct Download Link)


2. 해당 라이브러리를 설치한다.


lucifer@lucifer-Vostro-V13:~/Downloads$ sudo dpkg -i libicu52_52.1-3ubuntu0.4_amd64.deb
[sudo] password for lucifer:
Selecting previously unselected package libicu52:amd64.
(Reading database ... 282018 files and directories currently installed.)
Preparing to unpack libicu52_52.1-3ubuntu0.4_amd64.deb ...
Unpacking libicu52:amd64 (52.1-3ubuntu0.4) ...
Setting up libicu52:amd64 (52.1-3ubuntu0.4) ...
Processing triggers for libc-bin (2.21-0ubuntu4.3) ...
lucifer@lucifer-Vostro-V13:~/Downloads$






PS.
위의 작업 후 아래와 같은 메시지가 발생하는 경우 링크로 들어가서 확인해 본다.
Cannot mix incompatible Qt library 에러 원인과 해결방법
1004lucifer

lucifer@lucifer-Vostro-V13:/devTools/apkstudio-d49d3de$ ./apkstudio.sh
Cannot mix incompatible Qt library (version 0x50402) with this library (version 0x50201)
Aborted (core dumped)

lucifer@lucifer-Vostro-V13:/devTools/apkstudio-d49d3de$


* 중요
위의 링크로 들어가서 작업을 해도 되지만 작업을 해 놓은 수정된 APK Studio 파일을 다운로드할 수 있게 올려놓았다. (다운받기)





참고: https://github.com/vaibhavpandeyvpz/apkstudio/issues/35






[Ubuntu] Cannot mix incompatible Qt library 에러 원인과 해결방법




OS: Ubuntu 15.10 gnome (x64)




증상

APK Studio 프로그램을 받아서 실행하려 하니 아래와 같이 오류메시지가 발생했다.
1004lucifer

lucifer@lucifer-Vostro-V13:/devTools/apkstudio-d49d3de$ ./apkstudio.sh
Cannot mix incompatible Qt library (version 0x50402) with this library (version 0x50201)
Aborted (core dumped)
lucifer@lucifer-Vostro-V13:/devTools/apkstudio-d49d3de$






원인

구글 검색을 해보니 QT 관련 라이브러리를 해당 프로그램으로 복사하라고 되어있었다.
아마 프로그램에 들어있는 QT 라이브러리들의 버전이 동일하지 않거나 잘못 된 것으로 예상이 된다.





해결과정

1. 실행하려는 프로그램에 libQt5*.so.5 라는 이름을 가진 파일들이 몇개 있었다.

lucifer@lucifer-Vostro-V13:/devTools/apkstudio-d49d3de$ tree
.
├── apkstudio
├── apkstudio.png
├── apkstudio.sh
├── libQt5Core.so.5
├── libQt5Gui.so
├── libQt5Gui.so.5
├── libQt5Widgets.so
├── libQt5Widgets.so.5
├── platforms
│   └── libqxcb.so
├── uninstall
├── uninstall.dat
└── Uninstall.desktop

1 directory, 15 files
lucifer@lucifer-Vostro-V13:/devTools/apkstudio-d49d3de$



2. 일단 QT를 다운로드받아 설치 했다.
    (설치과정을 모르겠으면 댓글 달아주세요. 추가로 설명 달겠습니다.)
1004lucifer
다운로드 링크
최신버전: https://www.qt.io/download-open-source/
모든버전: http://download.qt.io/archive/qt/


3. 설치된 QT 디렉토리에서 프로그램에서 사용하는 파일을 찾아 프로그램으로 복사를 해줬다.
lucifer@lucifer-Vostro-V13:/$ cp /devTools/Qt5.6.1/5.6/gcc_64/lib/libQt5Core.so /devTools/apkstudio-d49d3de/libQt5Core.so.5
lucifer@lucifer-Vostro-V13:/$ cp /devTools/Qt5.6.1/5.6/gcc_64/lib/libQt5Core.so /devTools/apkstudio-d49d3de/libQt5Gui.so.5
lucifer@lucifer-Vostro-V13:/$ cp /devTools/Qt5.6.1/5.6/gcc_64/lib/libQt5Core.so /devTools/apkstudio-d49d3de/ libQt5Widgets.so.5
1004lucifer

4. 프로그램을 다시 실행시키니 아래와 같이 다시 에러 메시지가 나오며 구동되지 않았다.
lucifer@lucifer-Vostro-V13:/devTools/apkstudio-d49d3de$ ./apkstudio.sh
/devTools/apkstudio-d49d3de/./apkstudio: error while loading shared libraries: libicui18n.so.56: cannot open shared object file: No such file or directory
lucifer@lucifer-Vostro-V13:/devTools/apkstudio-d49d3de$


5. libicui18n.so.56 이 없어서 구동이 안된다고 하는데..
   지금 작업을 하기전에 libicui18n.so.52 를 이미 설치했었다.
   QT 버전에 따라 필요한 라이브러리 버전이 다르다고 느껴졌다.
   libicui18n.so.52 를 사용하는 QT를 설치한 후 Library를 복사했다.
   (버전에 맞는 QT를 찾느라 QT를 버전별로 5번 정도 설치한것 같은데..
    이럴줄 알았으면 차라리 libicui18n.so.56 라는걸 찾아서 설치하거나 소스를 받아 컴파일 하는게 빠르겠다.)
lucifer@lucifer-Vostro-V13:/devTools/apkstudio-d49d3de$ cp /devTools/Qt5.3.0/5.3/gcc_64/lib/libQt5Core.so ./libQt5Core.so.5
lucifer@lucifer-Vostro-V13:/devTools/apkstudio-d49d3de$ cp /devTools/Qt5.3.0/5.3/gcc_64/lib/libQt5Gui.so ./libQt5Gui.so.5
lucifer@lucifer-Vostro-V13:/devTools/apkstudio-d49d3de$ cp /devTools/Qt5.3.0/5.3/gcc_64/lib/libQt5Widgets.so ./libQt5Widgets.so.5


6. 제대로 맞는 버전으로 Library를 복사해주니 정상적으로 실행되는 것을 확인했다.





요약
* 소스를 다운받아서 컴파일 할 수 있다면 소스를 받아 컴파일 하는게 좋음!!

직접 컴파일 할 수 없다면..
1. 프로그램에 QT 관련 라이브러리가 있는지 확인 (libQT로 시작되는 파일)
2. QT 프로그램 설치
3. 다른 의존성 라이브러리가 필요하면 메시지가 나오지 않을 때 까지 설치
4. 프로그램 실행


2016년 6월 11일 토요일

[Gradle] Gradle을 Daemon으로 띄워서 빌드 실행속도(성능)를 높여보자.



OS: ubuntu
Gradle ver: 2.13


Gradle을 알아보면서 실행할 때마다 Daemon 을 사용하면 더 빨라진다는 내용이 나오는데 계속 보고있자니 거슬려서 Deamon을 사용하도록 설정했다.


설정방법

셋팅 방법은 아래와 같이 gradle.properties 파일을 만들고 내용을 채워넣어준다.
$ vi ~/.gradle/gradle.properties
(윈도우7의 경우에는 "C:\Users\<username>\gradle.properties" 파일을 생성해 주면 된다.)

org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.workers.max=3
org.gradle.configureondemand=true
org.gradle.jvmargs=-Xms128m -Xmx256m

1004lucifer
위의 작업을 다 한 후 gradle 을 실행하면 데몬이 구동이 되고 이후에는 gradle 이 빠르게 작동된다.



PS.
한가지 유의해야 할 점은 위와같이 Gradle Daemon을 셋팅 했음에도 속도가 느리게 느껴질 수 있다.
Gradle은 JVM에서 동작하는데  Gradle Daemon을 사용하면 매전 JVM을 실행하거나 정지하지 않아도 된다.
그렇기 때문에 Daemon 셋팅 시 첫번째는 기존과 비슷한 속도로 수행이 될테며 두번째부터 빠른 속도를 체감 할 수 있다.
Gradle Daemon은 시간이 지나면 자동으로 종료를 한다.(기본 3시간)



데몬구동 설정하기 전


lucifer@lucifer-Vostro-V13:/source/gradle/160611/test01$ gradle task
:tasks

------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------

Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
buildDependents - Assembles and tests this project and all projects that depend on it.
buildNeeded - Assembles and tests this project and all projects it depends on.
classes - Assembles main classes.
clean - Deletes the build directory.
jar - Assembles a jar archive containing the main classes.
testClasses - Assembles test classes.

Build Setup tasks
-----------------
init - Initializes a new Gradle build. [incubating]
wrapper - Generates Gradle wrapper files. [incubating]

Documentation tasks
-------------------
javadoc - Generates Javadoc API documentation for the main source code.

Help tasks
----------
buildEnvironment - Displays all buildscript dependencies declared in root project 'test01'.
components - Displays the components produced by root project 'test01'. [incubating]
dependencies - Displays all dependencies declared in root project 'test01'.
dependencyInsight - Displays the insight into a specific dependency in root project 'test01'.
help - Displays a help message.
model - Displays the configuration model of root project 'test01'. [incubating]
projects - Displays the sub-projects of root project 'test01'.
properties - Displays the properties of root project 'test01'.
tasks - Displays the tasks runnable from root project 'test01'.

Verification tasks
------------------
check - Runs all checks.
test - Runs the unit tests.

Rules
-----
Pattern: clean<TaskName>: Cleans the output files of a task.
Pattern: build<ConfigurationName>: Assembles the artifacts of a configuration.
Pattern: upload<ConfigurationName>: Assembles and uploads the artifacts belonging to a configuration.

To see all tasks and more detail, run gradle tasks --all

To see more detail about a task, run gradle help --task <task>

BUILD SUCCESSFUL

Total time: 9.182 secs

This build could be faster, please consider using the Gradle Daemon: https://docs.gradle.org/2.13/userguide/gradle_daemon.html
lucifer@lucifer-Vostro-V13:/source/gradle/160611/test01$





데몬구동 설정 후 두번째 수행 시


lucifer@lucifer-Vostro-V13:/source/gradle/160611/test01$ gradle task
Parallel execution with configuration on demand is an incubating feature.
:tasks

------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------

Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
buildDependents - Assembles and tests this project and all projects that depend on it.
buildNeeded - Assembles and tests this project and all projects it depends on.
classes - Assembles main classes.
clean - Deletes the build directory.
jar - Assembles a jar archive containing the main classes.
testClasses - Assembles test classes.

Build Setup tasks
-----------------
init - Initializes a new Gradle build. [incubating]
wrapper - Generates Gradle wrapper files. [incubating]

Documentation tasksIOException
-------------------
javadoc - Generates Javadoc API documentation for the main source code.

Help tasks
----------
buildEnvironment - Displays all buildscript dependencies declared in root project 'test01'.
components - Displays the components produced by root project 'test01'. [incubating]
dependencies - Displays all dependencies declared in root project 'test01'.
dependencyInsight - Displays the insight into a specific dependency in root project 'test01'.
help - Displays a help message.
model - Displays the configuration model of root project 'test01'. [incubating]
projects - Displays the sub-projects of root project 'test01'.
properties - Displays the properties of root project 'test01'.
tasks - Displays the tasks runnable from root project 'test01'.

Verification tasks
------------------
check - Runs all checks.
test - Runs the unit tests.

Rules
-----
Pattern: clean<TaskName>: Cleans the output files of a task.
Pattern: build<ConfigurationName>: Assembles the artifacts of a configuration.
Pattern: upload<ConfigurationName>: Assembles and uploads the artifacts belonging to a configuration.

To see all tasks and more detail, run gradle tasks --all

To see more detail about a task, run gradle help --task <task>

BUILD SUCCESSFUL

Total time: 2.147 secs
lucifer@lucifer-Vostro-V13:/source/gradle/160611/test01$





참조
http://knight76.tistory.com/entry/gradle-%EB%B9%8C%EB%93%9C-%EC%84%B1%EB%8A%A5-%EB%86%92%EC%9D%B4%EA%B8%B0
https://docs.gradle.org/2.13/userguide/gradle_daemon.html
https://docs.gradle.org/current/userguide/build_environment.html


[Linux] vim 에서 gradle 확장자의 syntax highlighting 되지 않는문제



OS: ubuntu 15.10 gnome
VIM ver: 7.4.712



증상

gradle 을 공부하면서 vi로 build.gradle 을 열어봤는데 groovy 형식의 syntax highlighting 이 되지 않았다.




해결 방법

아래와 같이 작업하면 groovy syntax highlighting 이 된다.
1004lucifer
1. vi로 gradle 파일을 오픈 후 :set filetype=groovy 라고 입력

 
2. 아래의 파일에 gradle 형식의 확장자를 지정해 준다. (권장)
/usr/share/vim/vim74/filetype.vim
(vim74 부분은 vim 버전에 따라 경로가 변경될 수 있다.)

" Vim support file to detect file types
"
" Maintainer:   Bram Moolenaar <Bram@vim.org>
" Last Change:  2015 Apr 06

" Listen very carefully, I will say this only once
if exists("did_load_filetypes")
  finish
endif
let did_load_filetypes = 1

" Line continuation is used here, remove 'C' from 'cpoptions'
let s:cpo_save = &cpo 
set cpo&vim

augroup filetypedetect

au BufNewFile,BufRead *.gradle setf groovy

" Ignored extensions






참조:
http://galsys.tumblr.com/post/51692458778/gradle-syntax-highlighting-in-vim
https://gist.github.com/uarun/1123563

2016년 6월 10일 금요일

[Tomcat] 톰캣이 정상적으로 기동되지 않는문제 (원인분석하기)





이따금씩 개발환경을 윈도우에서 톰캣을 띄워야 하는 경우가 있다.





톰캣을 구동시키려 startup.bat 파일을 실행하면 커맨드(cmd) 창이 나타났다가 에러메시지가 나타나고 바로 창이 닫혀버리기 때문에 뭐가 문제인지 확인도 못하고 어떻게 해야 할지 잘 모르는 경우가 있다.



이런경우 왜 톰캣이 정상적으로 구동되지 않는지 원인분석을 아래와 같은 방법으로 알아볼 수 있다.




startup.bat 파일은 내부적으로 catalina.bat 를 호출한다.
catalina.bat run 명령어를 통해 창이 따로 열리지 않은 상태에서 톰캣을 구동시킬 수 있기 때문에 창이 닫혀서 에러로그를 볼 수 없는 상황에서 벗어날 수 있다.

아래의 상황은 8009 포트가 이미 열려있기 때문에 톰캣을 정상적으로 구동할 수 없다고 나와있다.
그때의 상황은 IntelliJ IDEA 에서 톰캣을 이미 구동하고 있었기 때문에 포트가 겹쳐서 발생한 문제였다. 기존에 띄워진 톰캣을 종료시키니 정상적으로 톰캣을 띄울 수 있었다.

1004lucifer


K:\devTools\apache-tomcat-7.0.69\bin>catalina.bat run
Using CATALINA_BASE:   "K:\devTools\apache-tomcat-7.0.69"
Using CATALINA_HOME:   "K:\devTools\apache-tomcat-7.0.69"
Using CATALINA_TMPDIR: "K:\devTools\apache-tomcat-7.0.69\temp"
Using JRE_HOME:        "C:\Program Files\Java\jdk1.6.0_45"
Using CLASSPATH:       "K:\devTools\apache-tomcat-7.0.69\bin\bootstrap.jar;K:\devTools\apache-tomcat-7.0.69\bin\tomcat-juli.jar"
2016. 6. 10 오후 3:43:53 org.apache.catalina.startup.VersionLoggerListener log
정보: Server version:        Apache Tomcat/7.0.69
2016. 6. 10 오후 3:43:53 org.apache.catalina.startup.VersionLoggerListener log
정보: Server built:          Apr 11 2016 07:57:09 UTC
2016. 6. 10 오후 3:43:53 org.apache.catalina.startup.VersionLoggerListener log
정보: Server number:         7.0.69.0
2016. 6. 10 오후 3:43:53 org.apache.catalina.startup.VersionLoggerListener log
정보: OS Name:               Windows 7
2016. 6. 10 오후 3:43:53 org.apache.catalina.startup.VersionLoggerListener log
정보: OS Version:            6.1
2016. 6. 10 오후 3:43:53 org.apache.catalina.startup.VersionLoggerListener log
정보: Architecture:          amd64
2016. 6. 10 오후 3:43:53 org.apache.catalina.startup.VersionLoggerListener log
정보: Java Home:             C:\Program Files\Java\jdk1.6.0_45\jre
2016. 6. 10 오후 3:43:53 org.apache.catalina.startup.VersionLoggerListener log
정보: JVM Version:           1.6.0_45-b06
2016. 6. 10 오후 3:43:53 org.apache.catalina.startup.VersionLoggerListener log
정보: JVM Vendor:            Sun Microsystems Inc.
2016. 6. 10 오후 3:43:53 org.apache.catalina.startup.VersionLoggerListener log
정보: CATALINA_BASE:         K:\devTools\apache-tomcat-7.0.69
2016. 6. 10 오후 3:43:53 org.apache.catalina.startup.VersionLoggerListener log
정보: CATALINA_HOME:         K:\devTools\apache-tomcat-7.0.69
2016. 6. 10 오후 3:43:53 org.apache.catalina.startup.VersionLoggerListener log
정보: Command line argument: -Djdk.tls.ephemeralDHKeySize=2048
2016. 6. 10 오후 3:43:53 org.apache.catalina.startup.VersionLoggerListener log
정보: Command line argument: -Djava.util.logging.config.file=K:\devTools\apache-tomcat-7.0.69\conf\logging.properties
2016. 6. 10 오후 3:43:53 org.apache.catalina.startup.VersionLoggerListener log
정보: Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
2016. 6. 10 오후 3:43:53 org.apache.catalina.startup.VersionLoggerListener log
정보: Command line argument: -Djava.endorsed.dirs=K:\devTools\apache-tomcat-7.0.69\endorsed
2016. 6. 10 오후 3:43:53 org.apache.catalina.startup.VersionLoggerListener log
정보: Command line argument: -Dcatalina.base=K:\devTools\apache-tomcat-7.0.69
2016. 6. 10 오후 3:43:53 org.apache.catalina.startup.VersionLoggerListener log
정보: Command line argument: -Dcatalina.home=K:\devTools\apache-tomcat-7.0.69
2016. 6. 10 오후 3:43:53 org.apache.catalina.startup.VersionLoggerListener log
정보: Command line argument: -Djava.io.tmpdir=K:\devTools\apache-tomcat-7.0.69\temp
2016. 6. 10 오후 3:43:53 org.apache.catalina.core.AprLifecycleListener lifecycleEvent
정보: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program
Files\Java\jdk1.6.0_45\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:\Windows\;C:\ProgramData\Oracle\Java\javapath;C:\Program Files (x86)\Intel\i
CLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program F
iles (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R
) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Git\cmd;C:\Program Files\Git\mingw64\bin;C:
\Program Files\Git\usr\bin;C:\Program Files\nodejs\;C:\Program Files (x86)\GtkSharp\2.12\bin;C:\sdk\android\platform-tools;K:\devTools\gradle-2.13\bin;C:\Window
s\Softcamp\SDS;C:\Windows\Softcamp\SDS\x64;C:\Windows\Softcamp\SDK;C:\Windows\Softcamp\SDK\x64;C:\Program Files\Bandizip\7z;C:\Users\HuhWook\AppData\Roaming\npm
;C:\Users\HuhWook\AppData\Local\atom\bin;.
2016. 6. 10 오후 3:43:53 org.apache.coyote.AbstractProtocol init
정보: Initializing ProtocolHandler ["http-bio-8080"]
2016. 6. 10 오후 3:43:53 org.apache.coyote.AbstractProtocol init
정보: Initializing ProtocolHandler ["ajp-bio-8009"]
2016. 6. 10 오후 3:43:53 org.apache.coyote.AbstractProtocol init
심각: Failed to initialize end point associated with ProtocolHandler ["ajp-bio-8009"]
java.net.BindException: Address already in use: JVM_Bind <null>:8009
        at org.apache.tomcat.util.net.JIoEndpoint.bind(JIoEndpoint.java:413)
        at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:650)
        at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:434)
        at org.apache.catalina.connector.Connector.initInternal(Connector.java:978)
        at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
        at org.apache.catalina.core.StandardService.initInternal(StandardService.java:560)
        at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
        at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:838)
        at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
        at org.apache.catalina.startup.Catalina.load(Catalina.java:642)
        at org.apache.catalina.startup.Catalina.load(Catalina.java:667)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:253)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:427)
Caused by: java.net.BindException: Address already in use: JVM_Bind
        at java.net.PlainSocketImpl.socketBind(Native Method)
        at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:383)
        at java.net.ServerSocket.bind(ServerSocket.java:328)
        at java.net.ServerSocket.<init>(ServerSocket.java:194)
        at java.net.ServerSocket.<init>(ServerSocket.java:150)
        at org.apache.tomcat.util.net.DefaultServerSocketFactory.createSocket(DefaultServerSocketFactory.java:49)
        at org.apache.tomcat.util.net.JIoEndpoint.bind(JIoEndpoint.java:400)
        ... 16 more
2016. 6. 10 오후 3:43:53 org.apache.catalina.core.StandardService initInternal
심각: Failed to initialize connector [Connector[AJP/1.3-8009]]
org.apache.catalina.LifecycleException: Failed to initialize component [Connector[AJP/1.3-8009]]
        at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:106)
        at org.apache.catalina.core.StandardService.initInternal(StandardService.java:560)
        at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
        at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:838)
        at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
        at org.apache.catalina.startup.Catalina.load(Catalina.java:642)
        at org.apache.catalina.startup.Catalina.load(Catalina.java:667)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:253)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:427)
Caused by: org.apache.catalina.LifecycleException: Protocol handler initialization failed
        at org.apache.catalina.connector.Connector.initInternal(Connector.java:980)
        at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
        ... 12 more
Caused by: java.net.BindException: Address already in use: JVM_Bind <null>:8009
        at org.apache.tomcat.util.net.JIoEndpoint.bind(JIoEndpoint.java:413)
        at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:650)
        at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:434)
        at org.apache.catalina.connector.Connector.initInternal(Connector.java:978)
        ... 13 more
Caused by: java.net.BindException: Address already in use: JVM_Bind
        at java.net.PlainSocketImpl.socketBind(Native Method)
        at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:383)
        at java.net.ServerSocket.bind(ServerSocket.java:328)
        at java.net.ServerSocket.<init>(ServerSocket.java:194)
        at java.net.ServerSocket.<init>(ServerSocket.java:150)
        at org.apache.tomcat.util.net.DefaultServerSocketFactory.createSocket(DefaultServerSocketFactory.java:49)
        at org.apache.tomcat.util.net.JIoEndpoint.bind(JIoEndpoint.java:400)
        ... 16 more
2016. 6. 10 오후 3:43:54 org.apache.catalina.startup.Catalina load
정보: Initialization processed in 787 ms
2016. 6. 10 오후 3:43:54 org.apache.catalina.core.StandardService startInternal
정보: Starting service Catalina
2016. 6. 10 오후 3:43:54 org.apache.catalina.core.StandardEngine startInternal
정보: Starting Servlet Engine: Apache Tomcat/7.0.69
2016. 6. 10 오후 3:43:54 org.apache.catalina.startup.HostConfig deployDirectory
정보: Deploying web application directory K:\devTools\apache-tomcat-7.0.69\webapps\docs
2016. 6. 10 오후 3:43:54 org.apache.tomcat.websocket.server.WsSci onStartup
정보: JSR 356 WebSocket (Java WebSocket 1.1) support is not available when running on Java 6. To suppress this message, run Tomcat on Java 7, remove the WebSock
et JARs from $CATALINA_HOME/lib or add the WebSocket JARs to the tomcat.util.scan.DefaultJarScanner.jarsToSkip property in $CATALINA_BASE/conf/catalina.properti
es. Note that the deprecated Tomcat 7 WebSocket API will be available.
2016. 6. 10 오후 3:43:54 org.apache.catalina.startup.HostConfig deployDirectory
정보: Deployment of web application directory K:\devTools\apache-tomcat-7.0.69\webapps\docs has finished in 386 ms
2016. 6. 10 오후 3:43:54 org.apache.catalina.startup.HostConfig deployDirectory
정보: Deploying web application directory K:\devTools\apache-tomcat-7.0.69\webapps\examples
2016. 6. 10 오후 3:43:54 org.apache.catalina.startup.HostConfig deployDirectory
정보: Deployment of web application directory K:\devTools\apache-tomcat-7.0.69\webapps\examples has finished in 266 ms
2016. 6. 10 오후 3:43:54 org.apache.catalina.startup.HostConfig deployDirectory
정보: Deploying web application directory K:\devTools\apache-tomcat-7.0.69\webapps\host-manager
2016. 6. 10 오후 3:43:54 org.apache.catalina.startup.HostConfig deployDirectory
정보: Deployment of web application directory K:\devTools\apache-tomcat-7.0.69\webapps\host-manager has finished in 67 ms
2016. 6. 10 오후 3:43:54 org.apache.catalina.startup.HostConfig deployDirectory
정보: Deploying web application directory K:\devTools\apache-tomcat-7.0.69\webapps\manager
2016. 6. 10 오후 3:43:54 org.apache.catalina.startup.HostConfig deployDirectory
정보: Deployment of web application directory K:\devTools\apache-tomcat-7.0.69\webapps\manager has finished in 62 ms
2016. 6. 10 오후 3:43:54 org.apache.catalina.startup.HostConfig deployDirectory
정보: Deploying web application directory K:\devTools\apache-tomcat-7.0.69\webapps\ROOT
2016. 6. 10 오후 3:43:54 org.apache.catalina.startup.HostConfig deployDirectory
정보: Deployment of web application directory K:\devTools\apache-tomcat-7.0.69\webapps\ROOT has finished in 48 ms
2016. 6. 10 오후 3:43:54 org.apache.catalina.startup.HostConfig deployDirectory
정보: Deploying web application directory K:\devTools\apache-tomcat-7.0.69\webapps\tservice
2016. 6. 10 오후 3:43:54 org.apache.catalina.startup.HostConfig deployDirectory
정보: Deployment of web application directory K:\devTools\apache-tomcat-7.0.69\webapps\tservice has finished in 57 ms
2016. 6. 10 오후 3:43:54 org.apache.coyote.AbstractProtocol start
정보: Starting ProtocolHandler ["http-bio-8080"]
2016. 6. 10 오후 3:43:55 org.apache.catalina.startup.Catalina start
정보: Server startup in 983 ms
2016. 6. 10 오후 3:43:55 org.apache.catalina.core.StandardServer await
심각: StandardServer.await: create[localhost:8005]:
java.net.BindException: Address already in use: JVM_Bind
        at java.net.PlainSocketImpl.socketBind(Native Method)
        at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:383)
        at java.net.ServerSocket.bind(ServerSocket.java:328)
        at java.net.ServerSocket.<init>(ServerSocket.java:194)
        at org.apache.catalina.core.StandardServer.await(StandardServer.java:444)
        at org.apache.catalina.startup.Catalina.await(Catalina.java:781)
        at org.apache.catalina.startup.Catalina.start(Catalina.java:727)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:294)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:428)
2016. 6. 10 오후 3:43:55 org.apache.coyote.AbstractProtocol pause
정보: Pausing ProtocolHandler ["http-bio-8080"]
2016. 6. 10 오후 3:43:55 org.apache.coyote.AbstractProtocol pause
정보: Pausing ProtocolHandler ["ajp-bio-8009"]
2016. 6. 10 오후 3:43:55 org.apache.catalina.core.StandardService stopInternal
정보: Stopping service Catalina
2016. 6. 10 오후 3:43:55 org.apache.coyote.AbstractProtocol stop
정보: Stopping ProtocolHandler ["http-bio-8080"]
2016. 6. 10 오후 3:43:55 org.apache.coyote.AbstractProtocol destroy
정보: Destroying ProtocolHandler ["http-bio-8080"]
2016. 6. 10 오후 3:43:55 org.apache.coyote.AbstractProtocol stop
정보: Stopping ProtocolHandler ["ajp-bio-8009"]
2016. 6. 10 오후 3:43:55 org.apache.coyote.AbstractProtocol destroy
정보: Destroying ProtocolHandler ["ajp-bio-8009"]

K:\devTools\apache-tomcat-7.0.69\bin>