'분류 전체보기'에 해당되는 글 1012

  1. 2009.08.24 한글 인코딩 문제
  2. 2009.08.24 모 시스템 개발환경 구축
  3. 2009.08.23 레지스트리
  4. 2009.08.23 Eclipse Galileo + Subversive
  5. 2009.08.23 convert html to xml
  6. 2009.08.21 multiple
  7. 2009.08.21 ALM 교육
  8. 2009.08.20 archive
  9. 2009.08.20 컴퓨터 관리 - 공유 폴터
  10. 2009.08.20 작지만 알찬 서비스 - kisstunes
  11. 2009.08.19 java.lang.NoSuchMethodError
  12. 2009.08.19 파일 인코딩 변환
  13. 2009.08.19 [Excel] COUNT 함수
  14. 2009.08.14 시스템 Hangup 현상 분석
  15. 2009.08.13 Unix/DOS 명령어 비교
  16. 2009.08.12 java.lang.NumberFormatException: For input string: ""
  17. 2009.08.09 인증정보 노출
  18. 2009.08.09 JSTL - core
  19. 2009.08.09 스프링 2와 JPA 시작하기 - 에러해결
  20. 2009.08.08 Spring 2 + JPA + Tomcat
  21. 2009.08.07 Tomcat 인증
  22. 2009.08.07 Eclipse에서 Tomcat 구동시 사용하는 설정파일
  23. 2009.08.06 EL이 안되는 경우
  24. 2009.08.06 태그라이브러리 URI
  25. 2009.08.06 web.xml 버전별 비교
  26. 2009.08.06 Windows에서 프로세스 확인하기
  27. 2009.08.06 PrcView
  28. 2009.08.04 javap로 클래스 파일 버전 확인
  29. 2009.08.04 java.lang.UnsupportedClassVersionError
  30. 2009.07.31 레지스트리 백업

한글 인코딩 문제

D사 W시스템에서 데이터 조회시 한글이 깨짐

소스는 문자열을 넘겨받아서 위와 같이 출력해주는 형태임.

영문 Windows 환경이고 SunOne 6.1 사용중.
한글처리는 필터에서 처리하고 있음.
file.encoding 시스템 프로퍼티는 Cp1251 임.

여러가지 방법을 써봤는데도 깨짐

해결은 간단하다.

왜 이걸 처음부터 생각하지 못했지?

[todo] 윈도우즈에서 file.encoding 시스템 프로퍼티는 어디서 가져오나? rt.jar 를 봤는데 native 메서드에서 막혔음.
영문 윈도우이긴 하지만 언어설정이 한글로 되어 있었음.
[todo] 로그도 깨졌는데, 위와 같이 해서 한글이 깨지는지 확인할 필요가 있음.

모 시스템 개발환경 구축

D사 W시스템 개발환경 구축
  1. SunOne 6.1 과 동일한 Servlet/JSP 스펙인 Tomcat 4.1.40 설치
  2. JDK 1.4.1_30
  3. 이클립스 소스위치를 WEB-INF/src/ 로 변경, 이클립스 src 는 제거
  4. 기존 소스에서 WEB-INF/classes/ 는 제거 : 위 경우처럼 이클립스 설정을 변경하는 것이 더 좋은 방법임.
  5. com.inicis.inipay.INIpay41.class 를 디컴파일해서 소스에 추가함.(jar로 묶어도 될듯)
  6. (소스에서) 환경설정파일 위치 지정
  7. 환경설정파일에서 경로 변경
  8. server.xml에서 DataSource 설정
  9. 드라이버파일 추가
  10. web.xml 수정 : SunOne에서는 문제가 없는데 Tomcat에서는 dtd 체크를 해서 에러가 발생함.
[todo] web.xml 수정한거 올리기

레지스트리

- reg 파일
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Update]
"UpdateMode"=dword:0
새로 만들 키이름은 쌍따옴표(" ")로 묶는다.
문자열값[종류:REG_SZ]은 키값에 쌍따옴표를 붙인다. (예: "키이름"="키값")
DWORD값[종류:DWORD]은 키값 앞에 dword: 를 붙인다. (예: "키이름"=dword:키값)
확장자는 .reg 로 만든다.

9x/Me 에서는 Windows Registry Editor Version 5.00 를 REGEDIT4 로 변경한다.

- 시작프로그램 레지스트리 위치
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

Eclipse Galileo + Subversive

- Eclipse Galileo 살펴보기
Galileo 에 포함된 프로젝트 소개 : CDT, EMF, Equinox, GEF, GMF, JDT, Mylyn, PDT, TPTP, WTP 등
(Galileo 에 대한 내용은 아님)

- Subversive 설치
Team Provider만 설치하면 될듯 ([todo] 종속적인 플러그인은 어떻게 되나?)

Connector 만 설치하면 된다고도 함.
http://www.polarion.org/projects/subversive/download/eclipse/2.0/update-site/

- 다양한 레이아웃이 있다.
Subclipse에서는 볼수 없었던 부분이다. 처음 소스형상관리를 할때 많이 고민했던 부분이었다.

- 또 다른 점
Galileo에서 추가되었는지 잘 모르겠지만 Synchronize with Repository에 단축키가 할당되어 있다.
그동안 별도로 키를 바인딩하거나 다른 방법을 썼었는데, 이거 마음에 든다.

- Compare with Each Other
Subversive, Subclipse도 가능함.
Subversive에서는 각 리비전별로 비교가 가능함.

- 참고
[리뷰] SVN 플러그인 Subversive 설치 정리

convert html to xml


multiple

mul·ti·ple
 a.
1a 복합적인, 복식
   a multiple tax 복합

b 다수의, 많은 부분[요소]으로 ;다수의, 다양
2전기다중의, 복합
3식물】 <과실이> 집합성의
4수학배수(倍數)
n.
1수학배수
2전기병렬;집합;단자
3연쇄점;(대량 생산의) 미술품

- 출처 : NAVER 영어사전

The length of a Base64 string must be a multiple of 4

ALM 교육

SW진흥원-SCA Opensource Application Lifecycle Management과정

하이텔 자바동에서 주관하는 교육이다.
참 오랜만에, 우여곡절 끝에 참석한다.

요즘 보니 중소기업 재직자를 위해 비용부담을 줄인 교육이 많은 것같다.
팀원들에게 적극적으로 권해야겠다.

교육은 Subversion, Maven, CI 등으로 구성되어 있다.
Maven에 대한 시간이 많은데 다른 부분이 좀 부족하지 않나 싶다.
ALM이면 이슈에 대한 관리도 필요할 것이고, CI로 자동화하는 부분은 테스트 자동화나 코드품질검사에 대한 부분이 관심이 있는데 배정된 시간이 얼마되지 않는다.
이슈관리는 팀에 적극적으로 도입하려고 하고 있다.

어쨌든 오랜만에 참석하는 교육이고, 여러 사람도 만나겠지.
새로운 것을 하나라도 배운다면 재미있을거 같다.

archive

ar·chive
a n.
1 [보통 pl.] (보관되어 있는) (古)기록;공문서
2 [pl.] 기록[공문서] 보관소, 문서
3 (데이터 의) 보관, 보존;【컴퓨터카이브 《다수파일압축하여 하나모은
4 [형용사적] 고문서관한
   archive science 고문서

vt. <문서·기록 을> (기록 보관소 등에) 보관하다;【컴퓨터】 <데이터를> 카이브에 수록하다

archive.apache.org

This site contains the historical archive of old software releases.

- 위키백과 - 아카이브

컴퓨터 관리 - 공유 폴터

- 공유된 디렉토리, 접근한 세션, 열린 파일 확인

작지만 알찬 서비스 - kisstunes

웹상에서 키보드나 피아노를 연주해 보자.

java.lang.NoSuchMethodError

java.lang.NoSuchMethodError: java.math.BigDecimal.divide(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;

- 실제 소스는 BigDecimal#divide(BigDecimal) 를 사용하고 있음.

- 컴파일시에는 JDK 1.5를 사용, 런타임시에는 1.4
위 메서드는 1.5에서 추가된 메서드임.

[todo] 다른 사이트에서도 이런 경우가 있음.
jtds 컴파일 안됨.....이거 정리하시오.
이거와 5.0 문법 안먹는거.
Compliance
JDK 1.4, 1.3 and 1.2 Compliant
http://jtds.sourceforge.net/features.html

파일 인코딩 변환

1. EditPlus에서 다른 이름으로 저장할때 인코딩을 지정해 줄수 있다.

2. iconv

3. Simple Text Encoding Converter 1.0

[Excel] COUNT 함수

COUNTIF(range, criteria)

- criteria에 ?, * 사용가능(~를 사용하면 ?, * 자체를 사용 가능함)

- 대소문자 구분 안함.

=COUNTIF(B8:B82,"*bank") //bank로 끝나는 모든 데이터
=COUNTIF(B8:B82,"a?") //a로 시작하는 두 글자의 데이터
=COUNTIF(B8:B82,">=3") //3이상인 데이터

//구글에서 가능, 엑셀에서는 조금 다름
=COUNTIF(B8:B82,"") //라인 개수
=COUNTIF(B8:B82,"*") //구글은 지금 현재는 빈셀의 개수임.

="전체 개수 : " & COUNT(B5:B63) //구글:count는 셀에 데이터가 있는 경우만 가능

 

COUNTA

=COUNTA(B2:B6)

 

Google Sheets

공백도 카운트된다. 값이 없으면 해당 열(행)을 삭제하기 위해 확인하는데 좋다.

 

https://support.microsoft.com/ko-kr/office/counta%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-%EB%B9%84%EC%96%B4-%EC%9E%88%EC%A7%80-%EC%95%8A%EC%9D%80-%EC%85%80-%EA%B0%9C%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0-a4fd3d22-4a47-4c3e-b2aa-40e6394315c7

 

 

=>구글스프레드와 엑셀을 비교할 것

시스템 Hangup 현상 분석

Z건설사 시스템이 페이지가 열리지 않는 경우가 발생함.

[todo] 스레드덤프를 남겼지만 분석을 하지 못함.

어디에서 발생하는 에러인지 원인이 WAS인지 DB인지 파악도 안됨.

DBCP 설정에서 removeAbandoned, logAbandoned를 true로 두고 모니터링을 함.

예외처리도 정확하게 되었지만 Connection이 닫히지 않아 누수가 되고 있다.

[todo] 스레드덤프받아서 분석해보자.

Unix/DOS 명령어 비교

- 시스템 정보 확인
uname / ver, winver

- 호스트명 확인
hostname / hostname

- 환경변수 확인
env / set

-

도스/윈도우 에서 리눅스로

java.lang.NumberFormatException: For input string: ""

숫자를 출력할 때 이런 에러가 종종 발생한다.
근본적으로는 데이터베이스에 이런 데이터가 들어가지 못하게 해야 한다.

JSTL 사용시 이런 값이 있는 경우

숫자포맷을 사용한다면 다음과 같이 사용

아니면 태그 라이브러리를 하나 만들어

- 2010-02-27 추가
레거시에서 데이터를 전달해주는데 EMPTY 문자열이 넘어와야 하는데 길이가 1인 경우도 있다.
<c:when test="${empty item.state}"> //" "인 경우 empty는 false를 반환한다.
<c:when test="${empty fn:trim(item.state)}"> //trim 처리를 한다.

인증정보 노출

인증정보(사용자 아이디, 부서코드, 권한 등)를 쿠키나 세션에 저장한다.
쿠키에 저장하는 경우 조작이 가능하므로 암호화 처리가 필요하다.

중간에 정보를 가로채어서 조작이 가능하므로 최초 로그인시 아이피를 저장해 두었다가 비교하는 것도 필요하다.

이러한 작업을 필터나 컨트롤러, 공통 커맨드 등에서 처리해서 개발자가 코딩시에는 비지니스 로직에 집중하도록 할 필요가 있다.

- 세션 사용시
아이디, 아이피 --> 필터에서 아이피 점검 --> Request 에 저장

- 쿠키 사용시
아이디+아이피 --> 암호화 --> 필터에서 복호화, 아이피 점검, User 객체로 처리해서 Request 에 저장


JSTL - core


스프링 2와 JPA 시작하기 - 에러해결

통합테스트 실행시 아래와 같은 에러 발생

1.
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'employeeService' defined in class path resource [com/ibm/dw/spring2/dwspring2-service.xml]: Cannot resolve reference to bean 'entityManagerFactory' while setting bean property 'entityManagerFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [com/ibm/dw/spring2/dwspring2-service.xml]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: No persistence units parsed from {classpath*:META-INF/persistence.xml}
...
Caused by: java.lang.IllegalStateException: No persistence units parsed from {classpath*:META-INF/persistence.xml}

persistence.xml 이 src/META-INF/ 에 있는지 확인한다.

2.
java.lang.IllegalArgumentException: Can not set java.lang.Object field org.springframework.test.jpa.AbstractJpaTests.shadowParent to com.ibm.dw.spring2.EmployeeServiceIntegrationTest
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:146)
...
    at org.springframework.test.jpa.AbstractJpaTests.runBare(AbstractJpaTests.java:246)
...
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)

스프링 라이브러리를 2.0 RC2 로 한다. 2.5 에서는 위와 같은 에러가 발생한다.
필요한 라이브러리는 toplink-essentials.jar, junit.jar, spring.jar, spring-mock.jar, commons-logging.jar, hsqldb.jar

AbstractJpaTests.java:246 (왜그런지...)

Spring 2 + JPA + Tomcat

- 스프링 2와 JPA 시작하기

* 도메인 분석을 수행함
* 비즈니스 객체와 서비스를 구현함
* 비즈니스 객체에 대한 단위 테스트
* 스프링 JPA를 사용해 비즈니스 객체에 데이터 접근 코드 쉽게 추가
* 스프링 DAO(Data Access Object)를 사용해 서비스 구현
* DB2® Express-C와 연동한 서비스에 대한 통합 테스트 코드 작성
* 사용자 인터페이스에 기반을 둔 스프링 Model-View-Controller(MVC)를 위한 컨트롤러 생성
* 사용자 인터페이스를 위한 뷰(view) 디자인
* 애플리케이션을 위한 배치 가능한 WAR 파일 생성
* 아파치 톰캣(Apache Tomcat) 서버에 애플리케이션을 구성하고 배치함

- 도메인 모델 분석
직원엔터티에서 주소를 분리한다.
오퍼레이션을 정의한다.
Employee.java 에서 setEmpid() 를 제거한다.(JPA 에 의해서 관리된다.)

- JPA 어노테이션에 대한 설명
Employee와 Address 인스턴스가 일대일 관계(@OneToOne(casecade=CascadeType.ALL)) 어노테이션으로 기술되어)를 맺고 있는 것을 기억하자. 이 어노테이션은 Employee 객체를 대상으로 하는 모든 엔티티 매니저 오퍼레이션이 그 객체와 관련된 Address 객체에도 영향을 준다는 것을 의미한다. 이 말은 RDBMS에 Employee 기록을 추가하는 어느 작업이든지 그에 대응하는 Address 기록도 만들어지는 것을 뜻한다. 이것은 RDBMS에서 종종 찾을 수 있는 연속되는 삭제 참조 무결성 개념의 확장된 개념이라 보면 되겠다.

- HSQLDB 이용, DB2 로 변경

- RDBMS로 수행하는 DAO 통합 테스트 작성하기

- SpringMVC

- 스프링 2를 위해 톰캣 준비하기
   1. 톰캣에 스프링 2 클래스로더 추가 : server/lib/spring-tomcat-weaver.jar, META-INF/context.xml
   2. 톰캣에 스프링 2 컨텍스트 로더 리스너(context loader listener) 추가
   3. 톰캣에 DB2 JDBC 드라이버 복사
   4. 톰캣을 위해 JNDI DB2 데이터소스 구성

- 참고
스프링 2와 JPA 시작하기 - 에러해결
Spring -JPA-Tomcat

[todo] 이거 설정만 바꾸면 다른 JPA 구현체로 바꿀수 있나?(2.0에서는 다른 구현체를 지원하지 않음. 2.5 는 에러남. 결국은 에러를 해결해야 하는데...)
[todo] 직접 해보기...금방될거야

Tomcat 인증

- web.xml

- tomcat-users.xml
로그인 실패하면 401 에러가 남.

- 결과
//인증을 받지 않은 경우
request.getRemoteUser() : null
request.getUserPrincipal() : null
principal.getName() : null

//role1이라는 사용자로 인증을 받은 경우
request.getRemoteUser() : role1
request.getUserPrincipal() : <user username="role1" password="tomcat" roles="role1"/>
principal.getName() : role1
request.isUserInRole(tomcat) : false
request.isUserInRole(role1) : true

//both라는 사용자로 인증을 받은 경우
request.getRemoteUser() : both
request.getUserPrincipal() : <user username="both" password="tomcat" roles="tomcat,role1"/>
principal.getName() : both //조금 이상하다.
request.isUserInRole(tomcat) : true
request.isUserInRole(role1) : true

//tomcat이라는 사용자는 role1이라는 권한이 없어서 거부된다.

- 참고
웹 어플리케이션 인증

Eclipse에서 Tomcat 구동시 사용하는 설정파일

CATALINA_HOME 은 Tomcat 이 설치된 위치가 되고
CATALINA_BASE 는 WORKSPACE/.metadata/.plugins/org.eclipse.wst.server.core/tmpN 으로 된다.

Servers 프로젝트내에 위치한 설정파일은 WORKSPACE/Servers/Tomcat v6.0 Server at localhost-config/ 에 위치한다.
여기에서 수정한 tomcat-users.xml 은 CATALINA_BASE/conf/ 에 디플로이된다.
(web.xml 은 수정해도 반영되지가 않네...)


- work/도 CATALINA_BASE 아래에서 찾을 수 있다.

EL이 안되는 경우

필요한 라이브러리(jstl.jar, standard.jar) 모두 넣었음.
Tomcat 5.5 환경에서 EL이 안됨

혹시나 해서 isELIgnored를 false로 두니깐 된다.

그런데 왜 C사 박모씨 개발환경에서만 이럴까?

그리고 el-enabled 속성은 없다.
스펙에도 없는데 왜 많은 사이트에서 이 속성을 언급하는지 모르겠다.

http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd
http://java.sun.com/xml/ns/j2ee/jsp_2_0.xsd
<xsd:element name="el-ignored"
           type="j2ee:true-falseType"
           minOccurs="0">
    <xsd:annotation>



태그라이브러리 URI

TLD 등록 방법

1. TLD 파일 경로를 지정해 준다.
2. 라이브러리 경로를 지정해 준다. META-INF/elf.tld 가 있어야 한다.

3.
web.xml JSP TLD의 uri도 맞추라고 함.

4. JSTL 사용시 web.xml에 등록하지 않아도 되는 이유
/WEB-INF/lib/stardartd.jar/META-INF/c.tld
- 참고 문서

[todo] tld 찾는 순서는 귀찮아서...나중에


web.xml 버전별 비교

Windows에서 프로세스 확인하기

- 작업관리자
이미지 경로 이름, 명령줄


- tasklist
 
- PrcView

- Process Explorer

- 실행 경로, 사용중인 포트 찾기를 참고한다.
=-=>콘솔로 실행시, 서비스로 실행시를 나눠야 할듯...jps도 마찬가지로 해당 페이지에 정리할 것

- [JAVA] jps

PrcView

- Process Viewer  for Windows
설치가 필요없다.

- 프로세스를 실행시킨 프로그램 확인하기

- Process Monitor를 띄우면 이후에 실행되는 프로세스를 추적할 수 있다.

- 로드된 DLL도 확인할 수 있다.

- 메모리도 확인할 수 있다.
http://www.ibm.com/developerworks/kr/library/j-memusage/#N10267

javap로 클래스 파일 버전 확인

> javap -verbose EDIReply
Compiled from "EDIReply.java"
public class com.edi.intra.EDIReply extends com.edi.intra.EDIBase
  SourceFile: "EDIReply.java"
  minor version: 0
  major version: 46
  Constant pool:
const #1 = class    #2;    //  com/edi/intra/EDIReply
const #2 = Asciz    com/edi/intra/EDIReply;

- ClassNotFoundException이 발생했음. 웹로직에서 런타임 버전과 컴파일된 클래스의 버전이 다른 경우에 발생하였다는 말에 javap 명령으로 버전 확인

[todo] os, 자바 시스템 프로퍼티를 확인해 볼 것. 현재 서버에 구동되고 있는 클래스파일의 버전 확인해 볼것.

java.lang.UnsupportedClassVersionError

java.lang.UnsupportedClassVersionError: spring/TestGreeting (Unsupported major.minor version 49.0) java.lang.UnsupportedClassVersionError: Bad version number in .class file

위 상황은 6.0에서 컴파일한 클래스를 5.0에서 돌렸을 때 발생
아마 5.0에서 컴파일한 클래스를 그 하위 버전에서 실행시켰을때 일거 같다.

 

Exception in thread "main" java.lang.UnsupportedClassVersionError: Xxx has been compiled by a more recent version of the Java Runtime (class file version 59.0), this version of the Java Runtime only recognizes class file versions up to 52.0

STS - Java Build Path - JRE 1.8, Project Facets - Java 1.4 였음. 1.8로 설정해서 처리

 

클래스 버전(java.class.version)

  • version 50.0 : 6.0
  • version 49.0 : 5.0
  • version 48.0 : 1.4
  • 46 이 1.2 라고는 하지만, 이 문서에서는 1.4.1
    Eclipse에서 Generated .class files compatibility를 1.2로 했을 때 46으로 나타남.

 

레지스트리 백업

> reg save HKEY_USERS\S-1-5-21\Software\SimonTatham\PuTTY c:/putty.hiv

> reg export HKEY_USERS\S-1-5-21\Software\SimonTatham\PuTTY c:/putty.reg