'日常茶飯事'에 해당되는 글 601

  1. 2009.03.06 [IBM dWs] Grails 마스터하기: 첫 번째 Grails 애플리케이션 구축하기
  2. 2009.03.03 문제 해결의 시작은 에러메세지
  3. 2009.03.03 작업관리자를 시작프로그램에 등록하기
  4. 2009.03.02 작업 스케줄러
  5. 2009.03.02 비교 프로그램
  6. 2009.03.01 jad
  7. 2009.03.01 [Excel] 시트명 알아내기
  8. 2009.03.01 유지보수 - 소스
  9. 2009.02.28 문자열 함수
  10. 2009.02.28 ASCII Table
  11. 2009.02.28 log4sql 1
  12. 2009.02.28 갑자기 발생하는 일에 대한 대처
  13. 2009.02.27 자바스크립트 문자열에 특수문자가 들어가서 에러가 나는 경우
  14. 2009.02.24 JSTL 제약사항 - 상수
  15. 2009.02.22 Eclipse WTP
  16. 2009.02.22 java.math.BigDecimal
  17. 2009.02.21 이클립스 플러그인
  18. 2009.02.21 Eclipse 3.4 Ganymede
  19. 2009.02.20 동일한 이름의 자바스크립트 함수
  20. 2009.02.20 10MB = 10 * 1024 * 1024 byte
  21. 2009.02.19 백업의 생활화
  22. 2009.02.16 개발 협업 도구
  23. 2009.02.13 Eclipse Code Assist
  24. 2009.02.07 Eclipse Working Sets 사용하기
  25. 2009.02.04 Eclipse에서 Subversion 사용하기
  26. 2009.02.01 SyntaxHighlighter 사용하기
  27. 2009.01.31 브라우저 판별법
  28. 2009.01.09 Tomcat 6 설치(Windows Service에 등록)
  29. 2009.01.08 Subversion 관리
  30. 2009.01.06 Telnet으로 웹페이지 호출

[IBM dWs] Grails 마스터하기: 첫 번째 Grails 애플리케이션 구축하기

- Installation

- Sample
> grails create-app trip-planner
> cd trip-planner
> grails create-domain-class Trip
Add member variable to grails-app/domain/Trip.groovy
> grails generate-all Trip
> grails run-app

Browse to http://localhost:8080/trip-planner
- 포트 변경




- 동적 스캐폴딩
trip-planner/grails-app/controllers/TripController.groovy
class TripController{
    def scaffold = Trip
}
전체 코드 15줄(grails stats 로 확인가능)로 CRUD 기능을 처리하는 웹어플리케이션을 작성할 수 있다.

- 참고자료
IBM developerWorks : Grails 마스터하기
NetBeans : Introduction to the Grails Web Framework

[Grails1.0 사용자 가이드] 전체 목록
Grails Korean Home

문제 해결의 시작은 에러메세지

03-03 17:26:59 ERROR xxx.sm.model.XX1234DAO.insertDetail(XX1234DAO.java:395) - com.microsoft.sqlserver.jdbc.SQLServerException: 고유 인덱스가 'PK_XX_DETAIL'인 개체 'dbo.XX_DETAIL'에 중복 키 행을 삽입할 수 없습니다.

테이블 구조를 살펴봤다.
PK 가 중복될수가 없는데...
넘어오는 데이터를 모두 비교하고 데이터베이스에 들어간 데이터를 점검해봐도 중복될 수가 없는데...
나중에는 클래스 디컴파일까지.


Unique Index 가 걸려 있었다.
에러메세지를 천천히 잘 읽어봤으면 금방 해결했을건데.
PK_XX_DETAIL 라고 하니 당연히 테이블 디자인에서 만 확인했다.

해당 테이블에서 PK 가 변경되었는데 ERWin 에서 작업하다 보니 이전 PK 가 Unique Index 로 남아 있었다.

작업관리자를 시작프로그램에 등록하기

1. 바로가기 만들기
2. 대상 : C:\WINDOWS\system32\taskmgr.exe
3. 실행 : 최소화
4. 아이콘 변경
5. 작업관리자 - 옵션 - 최소화할 때 숨기기 선택
6. 시작프로그램에 추가

- Windows 7 시작프로그램 위치
C:\Users\pantarei\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

작업 스케줄러

- Windows 2008 작업 스케줄러


비교 프로그램

diff

 

WinMerge

http://winmerge.org

?관리자 권한으로 실행해서 설치할 것.

 

gvim

 

Tortoise Merge

 

beyond compare

http://shiyoul.egloos.com/4360208

 

Notepad++ Compare

https://pantarei.tistory.com/8765

 

Eclipse

Compare With - Each Other

 

 

jad

> jad -sjava -8 -lnc CLASS

-프로그램 연결
제어판/폴더 옵션



- 한꺼번에 여러개의 클래스를 디컴파일하기[각주:1]
classes> jad -sjava -r -dsrc **/*.class //디컴파일된 소스는 src/에 패키지구조대로 저장한다.

  1. 2009-09-11 [본문으로]

[Excel] 시트명 알아내기

=REPLACE(CELL("filename",A1),1,FIND("]",CELL("filename",A1)),"")

새 엑셀파일을 생성한뒤 파일을 저장해야 한다.

유지보수 - 소스

- 아주 긴 클래스에서 개발자가 소스를 수정하다가 현재 작업중인 부분과 전혀 상관없는 아래 코드를 잘못 수정했다.
이런 실수를 방지할 수 있는 방법은 없을까?
- 아래와 같은 JSTL 이 지금까지 에러 안나고 있었음
이전 환경 : Tomcat 5.0 이나 Resin 3.0.25
Tomcat 6.0.18 에서 에러 발생

문자열 함수


=-=> oracle?


ASCII Table

log4sql

http://log4sql.sourceforge.net

로그를 출력한 정확한 위치가 나오지는 않는다. 설정을 변경해서 로그를 출력하는 위치를 지정할 수 있다.
그러나 간단한 설정으로 쿼리문을 로깅할 수 있어 편하다. (2009-08-28)[각주:1]
P6Spy 도 있음.

- Add log4sql.jar

- Change driver class name
 oracle.jdbc.drirver.OracleDriver  core.log.jdbc.driver.OracleDriver
 com.mysql.jdbc.Driver - or - org.gjt.mm.mysql.Driver
 core.log.jdbc.driver.MysqlDriver
 org.hsqldb.jdbcDriver
 core.log.jdbc.driver.HSQLDriver
 org.apache.derby.jdbc.ClientDriver
 core.log.jdbc.driver.DerbyDriver
 net.sourceforge.jtds.jdbc.Driver
 core.log.jdbc.driver.JTdsDriver
 sun.jdbc.odbc.JdbcOdbcDriver
 core.log.jdbc.driver.JdbcOdbcDriver
 com.microsoft.jdbc.sqlserver.SQLServerDriver
 core.log.jdbc.driver.MssqlDriver
 com.microsoft.sqlserver.jdbc.SQLServerDriver
 core.log.jdbc.driver.Mssql2005Driver

- Select Fix를 False로 두고 Select Position을 지정한다.

기본 설정(Select Position이 9)
[2009-08-28 12:18:51] [DEBUG]『xxx.fw.common.ControlServlet:perform(84)』 Elapsed Time [0:00:00.001] //정확한 위치가 나오지 않는다.
SELECT Top 5 seq, title, ...
FROM TB_NOTICE
WHERE use_yn = 'Y'
...

Select Fix를 False로 둔다.
[2009-08-28 12:26:50] [DEBUG]『『xxx.fw.common.ControlServlet:perform(84)』 Elapsed Time [0:00:00.000]
SELECT Top 5 seq, title, ...
FROM TB_NOTICE
WHERE use_yn = 'Y'
...
############## BELOW MESSAGE IS TRACE. NO ERROR! ##############
    [0] at core.log.logger.SL.getMessageThrowableForThread(SL.java:196)
    [1] at core.log.aop.handler.DaoInfo.log(DaoInfo.java:132)
    [2] at core.log.aop.handler.DaoInfo.doAround(DaoInfo.java:101)
    [3] at core.log.aop.reflection.profiler.AroundProfiler.invoke(AroundProfiler.java:19)
    [4] at $Proxy0.executeQuery(Unknown Source)
    [5] at com.caucho.sql.UserPreparedStatement.executeQuery(UserPreparedStatement.java:108)
    [6] at com.caucho.sql.UserPreparedStatement.executeQuery(UserPreparedStatement.java:108)
    [7] at xxx.aa.model.XxxDAO.getMainNoticeList(XxxDAO.java:135)
    [8] at xxx.aa.command.XxxCommand.execute(XxxCommand.java:43)
    [9] at xxx.fw.common.ControlServlet.perform(ControlServlet.java:84)
    [10] at xxx.fw.common.ControlServlet.doGet(ControlServlet.java:60)
    [11] at javax.servlet.http.HttpServlet.service(HttpServlet.java:115)
    [12] at javax.servlet.http.HttpServlet.service(HttpServlet.java:92)
    [13] at com.caucho.server.dispatch.ServletFilterChain.doFilter(ServletFilterChain.java:106)
    [14] at xxx.fw.common.EncodingFilter.doFilter(EncodingFilter.java:44)
    [15] at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)
    [16] at com.caucho.server.cache.CacheFilterChain.doFilter(CacheFilterChain.java:170)
    [17] at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:173)
    [18] at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:229)
    [19] at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:274)
    [20] at com.caucho.server.port.TcpConnection.run(TcpConnection.java:514)
    [21] at com.caucho.util.ThreadPool.runTasks(ThreadPool.java:520)
    [22] at com.caucho.util.ThreadPool.run(ThreadPool.java:442)
    [23] at java.lang.Thread.run(Thread.java:595)

Select Position을 7로 둔다.
[2009-08-28 12:36:25] [DEBUG]『xxx.aa.model.XxxDAO:getMainNoticeList(135)』 Elapsed Time [0:00:00.000] //쿼리문의 위치가 정확히 나오게 된다.
SELECT Top 5 seq, title, ...
FROM TB_NOTICE
WHERE use_yn = 'Y'
...
  1. log4sql 웹사이트에 설정방법이 나오는데 이해를 하지 못했다. 행자님의 댓글을 보고 다시 해보았다. [본문으로]

갑자기 발생하는 일에 대한 대처

맡고 있는 업무 특성상 갑자기 일이 들어오는 경우가 많다.
불쑥 전화와서는 이거 안되요... 이거 너무 불편한데...

갑자기 들어오는 업무를 제어하지 못하면 밀려드는 일정에 치여 야근을 해야만 한다.
우선순위를 무시하고 이런 업무를 바로 처리하게 되면 현재 하고 있는 일이 영향을 받게 된다.
급한 상황이 아니라면 별도의 시간을 정해서 한다. 그래야 현재 하고 있는 일을 진행할 수 있다.

고객사에 에러났다고 그거 하루종일 잡고 있어서 일정이 많이 틀어졌다.
별도의 시간으로 돌려야 계획대로 일을 진행하고 야근을 안한다.

가용한 시간을 적고 거기에 일을 하나씩 넣어야지 ...일에 따라 움직이니깐 매일 야근이다.
일을 너무 많이 받아서는 안된다.
안되는건 딱잘라서 안된다고 해야 함.

자바스크립트 문자열에 특수문자가 들어가서 에러가 나는 경우

\로 처리해 주면 된다.

- 파일 인코딩이 잘못된 경우에도 발생할 수 있다.

JSTL 제약사항 - 상수

간단하지만 편리한 기능때문에 JSP에서 JSTL 사용을 적극 권장하고 있다.
그러나 JSTL은 Java Bean에만 접근이 가능하고, 인자없는 getter만 사용가능하다.
상수를 참조할수도 없다.
Constants.TYPE_ADMIN 이라는 상수가 있는데 참조할 수가 없다.
그래서 하드코딩을 해야 한다.

- 그래서 isAdmin()을 추가한다.
- JSTL 구문에서 상수를 직접 사용할수 있도록 하자.

- 설계시점에 고려를 해서 뷰레이어가 단순해지도록 해야 한다.
뷰레이어에 Java코드를 사용하거나 상수를 사용하지 않는 것이 좋다.

Eclipse WTP

- 3.4 기준

- Dynamin Web Project 생성시 지정한 Context Root, Content Directory, Java Source Directory를 수정하기
Context Root는 Properties for PROJECT - Web Project Settings에서 수정가능
(Servers View - 해당 서버 Properties - Modules 탭에서도 가능)[각주:1]
Java Source Directory는 Build Path에서 수정가능
Content Directory는 PROJECT/.settings/org.eclipse.wst.common.component 파일을 수정하면 된다.

deploy-path가 설정되어 있어서 src/에 있는 프로퍼티 파일이 WEB-INF/classes/로 배포된다.
이걸 이용하면 다른 곳의 설정 파일도 쉽게 배포할 수 있을거 같네.

- Servers
포트를 다르게 하면 여러개의 서버 인스턴스를 실행시킬 수 있다.

예) 서버1
Tomcat admin port 8101
HTTP/1.1 8081
AJP/1.3 8201

서버2
Tomcat admin port 8102
HTTP/1.1 8082
AJP/1.3 8202

- Tomcat 과 연동시 server.xml 을 수정하고 나서 변경된 사항이 적용이 안되면 이클립스를 재시작한다.
  1. 여러 곳에서 변경할 수 있는데 상관 관계가 어떻게 되는지는 모르겠다. 2010-07-27 [본문으로]

java.math.BigDecimal


2009-11-09 추가

- 소수점 없애기

이클립스 플러그인

http://eclipse-plugins.2y.net/eclipse/index.jsp


===groovy, PMD

Eclipse 3.4 Ganymede

Eclipse IDE for Java EE Developers
Tools for Java developers creating JEE and Web applications, including a Java IDE, tools for JEE and JSF, Mylyn and others.

이클립스 V3.4 완전 정복, Part 1: 이클립스 IDE 워크벤치

Ganymede에 배포된 WTP 3.0에는 JSDT(JavaScript Development Environment)가 포함되어 있다.
이클립스 프로젝트에서 지원되니깐 계속 발전될 것이다.
자바스크립트 개발환경으로는 Aptana도 있다.(Europa에서 설치했다가 써보지는 못했는데 이클립스 플러그인말고 어플리케이션도 있음)
- JavaScript Development Toolkit (JSDT) Features를 참고할 것.
- 자바스크립트(JavaScript) 개발환경 확장하기
 
* Synchronize with Repository에 단축키를 할당했는데 안먹는다. Category가 CVS지만 3.3 에서는 되었는데...
대신 "마우스 오른쪽 - e - 엔터"

동일한 이름의 자바스크립트 함수

동일한 함수명이 있어도 된다.
자바스크립트에서는 함수도 변수처럼 사용될 수 있기 때문에 마지막에 선언된 함수가 실제 호출되는거 같다.
인자의 개수는 상관없다.
 

10MB = 10 * 1024 * 1024 byte


백업의 생활화

2009-02-11
지원양이 부산에서 오더니 부쩍 나를 많이 찾는다.
오늘까지 처리해야 하는 일이 있는데 일찍 퇴근했다.

퇴근전에 윈도우즈 업데이트를 하고 노트북을 챙기는데...가방이 넘어지면서 바닥으로 떨어졌다.
가방에 있어서 괜찮겠지 했는데 부팅이 되다 멈춘다.
허거걱...
최종 작업물을 서브버전에 언제 올렸지? 오늘 너무 바빠서 기억이 나지 않는다.
무슨 일이 있어도 살려야 한다.

두번 시도하다 안전모드로 부팅한뒤 다시 시작...안된다.
안전모드로 들어가서 시스템 복원을 했다.
공포의 블루스크린...
윽~

다시 전원을 넣었다.
한참 지난 뒤에 부팅이 되었다. 진짜?
휴~

앞으로는 백업을 정기적으로 하고 디스크 조각모음도 해야겠다.
이거 영 불안해서.

2009-02-1?
부팅이 되지 않는다.
안전모드로 부팅후 윈도우즈 업데이트하기전으로 시스템복원을 하면 부팅은 된다.
불안해서 중요한 데이터를 백업해서 다른 파티션에 두었다.

2009-02-16
부팅할 때마다 시스템복원을 해야 한다.
작업하느라 시간이 없어서 시스템을 다시 설치하지도 못했는데 오늘 오후 외근나간 동안 회사동료에게 윈도우즈 재설치를 부탁했다.
C 드라이브에 복구시디로 설치하면 될거라고...
복구시디로 설치하면 불안하다고 하더니 C, D, E 모두 날렸다.[각주:1]
헐...

여튼 데이터를 최대한 살려야 했다.
내일 제출할 보고서도 있고, 지원이 사진과 동영상이 꽤 되는데.
Final Data 를 하루종일 돌려서 복구가능한 파일을 찾았는데 손상된 파일이 많았다.
DiskInternals ZIP Repair 로 보고서를 복구했다.[각주:2]
지금 작업중인 소스는 회사 서버 Subversion 에 있고 외근 가기전에 커밋을 시켜서 다행이었다.
E 드라이브에 넣었던 백업파일이 있긴 했지만 보고서 빼고는 별 도움이 안되었고
며칠전 회사 서버에 백업을 해서 작업파일은 대부분 살렸다.
사진과 동영상은 복구해야 할 파일이 많다.[각주:3]

주기적으로 백업하고
이를 다른 곳에 저장시켜야 한다. 반드시
  1. 어떻게 된거냐니깐 주절주절 말이 많았다. 그냥 C 드라이브에 윈도우즈를 재설치하는 건데... 어쨌든 백업을 다른 곳(물리적으로)에 저장하지 않은 내 잘못이다. [본문으로]
  2. 오피스파일이나 음악파일 복구 등 다양한 프로그램이 있다. Office Recovery 는 유료다. [본문으로]
  3. 사진, 동영상 복구하는 좋은 프로그램 없나요? [본문으로]

개발 협업 도구

팀을 정비하면서
조직 운영과
프로세스를 정립할 필요가 있다.
기반시스템이란 것을 운영해야 할 필요성을 느낀다.

시간이 없어서 어떻게 하진 못하지만
하나씩 해보자

10개월동안 소스형상관리에 대한 노하우는 많이 쌓였고 실행했음.
협업도구로 위키를 사용했었는데 아직은 공유와 공개가 잘안되고 있음.
이제는 Trac을 도입하고 Mylyn과 연동, 테스트도입, CI를 사용할거다.

Eclipse Code Assist

소스에 javadoc 형태의 주석을 달아두면 코딩시 참조할 수 있어 아주 편하다.

마우스를 올려두면 주석을 볼 수 있다.


Ctrl 키를 누른채 마우스를 올려두면 소스를 볼 수 있다.
(Eclipse 3.3 부터인가(?)는 Shift 가 기본 설정으로 되어 있음)


Code Assist 에서 주석을 볼 수 있다. javadoc 형태의 주석이 아니라면 보이지 않는다.
해당 소스로 이동해서 주석을 보지 않아도 확인 가능하다.

Eclipse Working Sets 사용하기

이클립스 Search에서 검색범위 지정할 때 사용했었는데 이런 기능이 있었다.


관련된 프로젝트를 하나로 묶어서 관리할 수 있다.
Server 프로젝트에 여러개의 설정이 있을수 있는데 관련된 설정만 보이게 할 수 있어 편하다.
다른 프로젝트에 있는 리소스를 보이게도 할 수 있는데 구분이 되지않아 헷갈린다.


Open Resources에서도 Working Set을 지정할 수 있다.

Eclipse에서 Subversion 사용하기

Eclipse 3.3.2
Subclipse 1.0.0 (http://subclipse.tigris.org/update 에서 업데이트한다.)


SyntaxHighlighter 사용하기

스킨을 변경하면 기존에 설정해 두었던 SyntaxHighlighter 가 모두 없어지므로 정리해둔다.
  1. Download SyntaxHighlighter
  2. HTML/CSS 편집에서 다음 내용을 추가한다.
    <link type="text/css" rel="stylesheet" href="./images/SyntaxHighlighter.css"></link>
    <script type="text/javascript" src="./images/shCore.js"></script>
    <script type="text/javascript" src="./images/shBrushJava.js"></script>
    <script type="text/javascript" src="./images/shBrushXml.js"></script>
    <script type="text/javascript" src="./images/shBrushJScript.js"></script>
    <script type="text/javascript">
    dp.SyntaxHighlighter.ClipboardSwf = './flash/clipboard.swf';
    dp.SyntaxHighlighter.HighlightAll('code');
    </script>
    </body>
    </html>
  3. Scripts/ 와 Styles/ 에 있는 파일을 업로드하고 저장한다.
  4. 글 작성시 HTML 모드에서 <textarea name="code" class="java | html | AND SO ON"></textarea> 를 사용한다.

브라우저 판별법

ajaxian 에 재미있는 글이 올라왔다.
IE 를 구별하는 가장 짧은 방법이라고 한다. (현재, 여기도 가보시라)

Gareth Heyes 가 그의 블로그에 Firefox, IE, Safari, Chrome, Opera 를 구별하는 한줄짜리 스크립트를 포스팅했다.

Tomcat 6 설치(Windows Service에 등록)

고객사에 설치한 Tomcat 6 에서 문제가 발생해서 테스트를 위해서 Tomcat 5.5 가 설치되어 있는 윈도우머신에 Tomcat 6 를 추가로 설치하게 되었다.

Tomcat 5.5 가 서비스에 "Apache Tomcat" 이라는 표시 이름으로 등록되어 있어서 Tomcat 6 를 서비스로 등록할 수 없다.[각주:1]
Tomcat 5.5(서비스 이름은 Tomcat5) 를 "Apache Tomcat 5" 이라는 표시 이름으로 변경한 뒤 Tomcat 6 을 에러없이 설치를 완료할 수 있다.

> %CATALINA_HOME%/bin/tomcat5 //US//Tomcat5 --DisplayName="Apache Tomcat 5"

옵션은 Apache Tomcat 6.0 Windows service HOW-TO 를 참고.

하여튼 설치후 디렉토리 구조가 예전과 조금 달라진 것을 알 수 있다.
%CATALINA_HOME%/common/ 가 없어지고 lib/ 만 있다.
예전에 있던 common/endorsed/ 가 필요한데 없다. 난감하다.

윈도우 서비스에 등록된 경우 Configure Tomcat 를 누르면 나오는 Tomcat Properties 의 Java 탭에서 옵션을 지정할 수 있다.
%CATALINA_HOME%/endorsed/ 를 만들고 java.endorsed.dirs 속성에서 endorsed/ 를 지정해준다.

*참고
Java Endorsed Standards Override Mechanism
자바기술 지원 표준 (Java Endorsed Standards)


  1. MySQL 5(?) 에서는 서비스 등록시 이름을 선택할 수 있음. [본문으로]

Subversion 관리

- 저장소 관리
  1. 저장소 생성
    > svnadmin create --fs-type fsfs d:/svn_base/rep1 //rep1 이라는 저장소 생성

  2. svnserve.conf 설정(d:/svn_base/rep1/conf/)
    anon-access = none //익명사용자의 접근을 막는다.
    auth-access = write
    password-db = passwd
    authz-db = ../../conf/authz //여러 저장소에서 각각 지정하지 말고 한곳에서 관리하도록 할 수 있다.

  3. 권한 설정(authz) : Path-Based Authorization
    [/]
    * =
    pantarei = rw

    [rep1:/prj1/trunk]
    mir = rw

    [rep2:/]
    * = r #읽기전용

  4. 서버 시작
    > svnserve -d -r d:/svn_base //svn 프로토콜을 사용, 3690 포트 사용

- 서비스 등록
sc \\DEVTEST create svnserve binpath= "C:/Subversion/bin/svnserve.exe --service -r D:/Resources/svn_repos" DisplayName= "Subversion svnserve"

- 저장소 여러 개 사용하기
  1. 위와 같이 저장소를 모아둔 디렉토리를 기준으로 svnserve 를 실행시킨다.
  2. > svnserve -d -r d:/svn_base/rep2 --listen-port 3691
  3. password-db, authz-db 를 한곳에서 관리한다.


- 버전 정보 보기

> svnadmin --version //svnlook --version 동일
svnadmin, 버젼 1.4.6 (r28521)
    Dec 20 2007, 16:19:22에 컴파일 됨
...


Telnet으로 웹페이지 호출

> telnet 1.2.3.4 80
GET /ip.jsp HTTP/1.1
Host: 1.2.3.4 //엔터 두번

ip.jsp

- HTTP/1.0도 가능하고 host 헤더가 없는 경우도 가능하다.