* Apache Tomcat 일반계정으로 구동하기
  - jsvc 이용(Tomcat ver 6.0.18)

Apache Tomcat 웹 사이트에서 Tomcat 5.5 / Tomcat 6.x binary 를 다운로드 받아
압축을 풀어보면 bin 디렉토리 안에 jsvc.tar.gz 파일이 존재한다.
jsvc.tar.gz을 압축풀고 컴파일 한다.

아래는 설치(명령어만) 과정이다.
[root@host ~]# cd /usr/local/tomcat/bin
[root@host ~]# tar zxf jsvc.tar.gz
[root@host ~]# cd jsvc-src
# 실행가능하도록 퍼미션 변경
[root@host ~]# chmod 755 ./configure
# compile전 옵션 설정
[root@host ~]# ./configure --with-java=/usr/local/jdk
# compile
[root@host ~]# make
# daemon file 복사
[root@host ~]# cp native/jsvc $CATALINA_HOME/bin
# daemon 실행 shell script 복사
[root@host ~]# cp native/Tomcat5.sh $CATALINA_HOME/bin
# shell script 환경 설정(path 설정, tomcat user)
[root@host ~]# vi $CATALINA_HOME/bin/Tomcat5.sh
# 기동
[root@host ~]# $CATALINA_HOME/bin/Tomcat5.sh start
# 종료
[root@host ~]# $CATALINA_HOME/bin/Tomcat5.sh stop


아래는 Tomcat5.sh 파일을 수정해 Redhat계열의 init.d에서 돌아가도록 만든 파일이다.
#!/bin/sh
# Comments to support chkconfig on RedHat Linux
# chkconfig: 2345 80 20
# description: Apache Tomcat on JSVC tool.

# Source function library.
. /etc/rc.d/init.d/functions

##############################################################################
#
#   Copyright 2004 The Apache Software Foundation.
#
#   Licensed under the Apache License, Version 2.0 (the "License");
#   you may not use this file except in compliance with the License.
#   You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#   Unless required by applicable law or agreed to in writing, software
#   distributed under the License is distributed on an "AS IS" BASIS,
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#   See the License for the specific language governing permissions and
#   limitations under the License.
##############################################################################
#
# Small shell script to show how to start/stop Tomcat using jsvc
# If you want to have Tomcat running on port 80 please modify the server.xml
# file:
#
#    <!-- Define a non-SSL HTTP/1.1 Connector on port 80 -->
#    <Connector className="org.apache.catalina.connector.http.HttpConnector"
#               port="80" minProcessors="5" maxProcessors="75"
#               enableLookups="true" redirectPort="8443"
#               acceptCount="10" debug="0" connectionTimeout="60000"/>
#
# That is for Tomcat-5.0.x (Apache Tomcat/5.0)
#
# Adapt the following lines to your configuration


JAVA_HOME=/usr/local/jdk
CATALINA_HOME=/usr/local/tomcat
DAEMON_HOME=/usr/local/tomcat
TOMCAT_USER=tomcat

# for multi instances adapt those lines.
TMP_DIR=/var/tmp
PID_FILE=/var/run/jsvc.pid
CATALINA_BASE=/usr/local/tomcat

CATALINA_OPTS="-Djava.library.path=/usr/local/apr/lib"
CLASSPATH=\
$JAVA_HOME/lib/tools.jar:\
$CATALINA_HOME/bin/commons-daemon.jar:\
$CATALINA_HOME/bin/bootstrap.jar

PROGNAME=`basename $0`
RETVAL=0

start()
{
    START_COMMAND="\
    $DAEMON_HOME/bin/jsvc \
    -user $TOMCAT_USER
    -home $JAVA_HOME
    -Dcatalina.home=$CATALINA_HOME \
    -Dcatalina.base=$CATALINA_BASE \
    -Djava.io.tmpdir=$TMP_DIR \
    -wait 10 \
    -pidfile $PID_FILE \
    -outfile $CATALINA_HOME/logs/catalina.out \
    -errfile '&1' \
    $CATALINA_OPTS \
    -cp $CLASSPATH \
    org.apache.catalina.startup.Bootstrap"
    #
    # To get a verbose JVM \
    #-verbos \
    # To get a debug of jsvc
    #-debub

    echo -n $"Starting $PROGNAME : "
    daemon $START_COMMAND
    RETVAL=$?
    [ $RETVAL -eq 0 ] && [ -f $PID_FILE ]
    echo
    return $RETVAL
}


stop()
{
    STOP_COMMAND="\
    $DAEMON_HOME/bin/jsvc \
    -stop \
    -pidfile $PID_FILE \
    org.apache.catalina.startup.Bootstrap"

    echo -n $"Stopping $PROGNAME : "
    killproc jsvc 
    RETVAL=$?
    echo
    return $RETVAL
}

restart()
{
    stop
    start
}


case "$1" in
  start)
    start
    ;;

  stop)
    stop 
    ;;

  status)
    status -p $PID_FILE jsvc
    ;;

  restart)
    restart
    ;;

  *)
    echo "Usage $PROGNAME start/stop"
    exit 1;;
esac

exit $?


2010/04/05 16:31 2010/04/05 16:31

SQL to Java code 변환

Dev 2010/03/30 15:53
얼마전, AcroEdit를 설치해 보니, 매크로 스크립트 기능 중 플러그인 식으로
라인단위로 코드로 감싸는 기능이 있어 편리하겠다는 생각이 들었다.
하지만, Java 관련 개발 작업 시 Eclipse를 주로 사용하는 사람에게
그 기능을 사용하기 위해 다시 AcroEdit를 실행하고 다시 스크립트를 실행하는게 왠지
불편했다.
이럴바에 간단하게 만들어보자라는 취지로 해 봤다.

DB 연동해서 개발을 하다 보면 툴에서 SQL을 테스트하고 작성 완료해서
실제 Java 코딩으로 옮겨야 할 경우 일일이 코드에 삽입을 하게 된다.
예를 들어,
String sql   = "select a, b, c, d";
         sql += "   from tablename";
         sql += " where a = b      ";
         sql += "     and c = '1234';

이런 식의 코드나 StringBuffer 클래스를 이용하는

StringBuffer sql = new StringBuffer();
sql.append("select a, b, c, d \n");
sql.append("   from tablename \n");
sql.append(" where a = b      \n");
sql.append("     and c = '1234' \n);

이런 코드를 생성하기 마련이다.
물론, iBATIS를 이용하는 경우도 많지만 iBATIS를 이용하지 않을 경우에
위와 같은 일은 참 번거로운 일이 될것이다.

차라리, 이클립스에 실행 가능한 자바 클래스를 하나 만들어서 필요할 때 마다
실행해서 복사 후 붙여넣기를 하면 좋겠다는 생각이다.

/**
* 복사한 SQL문을 Java에서 사용 가능하도록 Code로 변환한다.
* @author dawnst
* 2010.03.29
*/

public class Sql2Java
{
   public static void main(String[] args)
   {   
       Sql2Java sj = new Sql2Java();
       System.out.println(sj.sql2Java().toString());
   }

   /**
    * ClipBoard 에 있는 내용을 반환한다.
    * @return String
    */
   private String getClipBoard()
   {
       String ret = "";
      
       java.awt.datatransfer.Clipboard clipboard = java.awt.Toolkit.getDefaultToolkit().getSystemClipboard();
       java.awt.datatransfer.Transferable data = clipboard.getContents(this);
       try
       {
           ret = (String) data.getTransferData(java.awt.datatransfer.DataFlavor.stringFlavor);
       }
       catch (java.awt.datatransfer.UnsupportedFlavorException e)
       {
           e.printStackTrace();
       }
       catch (java.io.IOException e)
       {
           e.printStackTrace();
       }
      
       return ret;
   }
  
   /**
    * ClipBoard의 SQL문을 Java의 SQL문 형태로 변환해 반환한다.
    * @return StringBuffer
    */
   private StringBuffer sql2Java()
   {
       String clipBoard = getClipBoard();
       StringBuffer buffer = new StringBuffer();
      
       if(clipBoard != null && clipBoard.length() > 0)
       {
           String [] line = clipBoard.split("\n");
          
           // SQL문 Line의 문자수를 세어 가장 많은 문자수를 찾는다.
           int maxCharLength = 0;
           for(int i=0; i<line.length; i++)
           {
               if(maxCharLength < line[i].length())
               {
                   maxCharLength = line[i].length();
               }
           }
          
          
           for(int i=0; i<line.length; i++)
           {
               if(i==0)
               {
                   buffer.append("StringBuffer sql = new StringBuffer();\n");
                   buffer.append("sql.             append(\""+line[i]);
               }
               else
               {
                   buffer.append("sql.append(\"\\n\").append(\""+line[i]);

               }
              
               // 최대 SQL 문자수 보다 적은 Line은  최대 문자수 만큼 공백으로 자리수를 채운다.
               for(int j=0; j<maxCharLength - line[i].length(); j++)
               {
                   buffer.append(" ");
               }
              
               buffer.append("\");");
               buffer.append("\n");
           }
       }
      
       return buffer;
   }
}

사용 방법은
1. 이클립스에 프로젝트를 하나 만들던가, 아니면, 기존에 만들어진 프로젝트에 클래스 하나를 만들어 run에 등록한다.
2. SQL 툴에서 만들어지 SQL문을 복사(Ctl+c)한다
3. run에 등록된 내용을 실행한다.
4. 출력창에 출력된 Java SQL 코드를 복사해 개발하는데 붙여넣기 등, 이용한다.


실행 결과
StringBuffer sql = new StringBuffer();
sql.             append("select a, b, c, d");
sql.append("\n").append("  from tablename ");
sql.append("\n").append(" where a = b     ");
sql.append("\n").append("   and c = '1234'");

2010/03/30 15:53 2010/03/30 15:53
<html>
<head>
<script tyle="text/javascript">
   function print_content() 
   {  
       var initBody = document.body.innerHTML;  
       window.onbeforeprint = function() 
       {  
           document.body.innerHTML = document.getElementById('프린트 지정 Div').innerHTML;  
       }  
      
       window.onafterprint = function(){ 
           document.body.innerHTML = initBody;  
       }  
        
       window.print();
   }
</script>
</head>
<body>
<div id="프린트 지정 Div">
<table boder="0" width="100%">
<tr>
   <td>이곳이 인쇄됩니다.</td>
</tr>
</table>
</div>
<table boder="0" width="100%">
<tr>
   <td><input type="button" value="인쇄" onClick="print_content();"></td>
</tr>
</table>
</body>
</html>


2010/03/04 15:20 2010/03/04 15:20

Linux find 명령어 요약

Dev 2010/02/05 10:23
find 명령어

파일과 디렉토리를 검색하는 명령어, grep 과 find 를 잘 활용하면 자기가 찾고자 하는 파일을 쉽게 찾을수 있다.

옵션
- name filename : 찾고자 하는 파일명을 검색  ( 사용예 : -name *.txt )
- atime +n : access time 이 n 일 이전인 파일을 찾는다.
- atime -n : access time 이 n 일 이내의 파일을 찾는다.
- mtime +n : n일 이전에 변경된 파일을 찾는다.
- mtime -n : n일 이내에 변경된 파일을 찾는다.
- type x : f - 파일 , d - 디렉토리
- maxdepth n : 지정된 디렉토리에서 n개 하위 디렉토리까지 검색

처리방법
- print : 찾은 파일의 절대 경로를 화면에 출력
- exec cmd {} \; 명령어 구분자로 ; 을 사용하기 때문에 \; 를 항상 붙여주어야 한다.

사용예1> 파일명이 *.log 이고 수정일이 3일 이전 파일을 삭제
- find . -name "*.log" -a -mtime +3 -exec rm {} \;

사용예2> 수정된지 7일 이상된 파일을 삭제한다.
- find /home/log -type f -mtime +7 -exec rm -f {} \;

사용예3> 수정된지 600일 이상된 파일을 ./backup 디렉토리로 이동한다.
- find . -name "local*" -mtime +600 -type f -exec mv {} ./backup \;

사용예4> 하위 2개 디렉토리까지 검색한다. maxdepth = 1 이면 현재 디렉토리만 검색
- find . -name "local*" -mtime +590 -type f -maxdepth 2


// http://citylock.tistory.com/124 에서 발췌


2010/02/05 10:23 2010/02/05 10:23
Tags:

10년 후 나의 모습을 그려보라.
바쁜 세상이다. 먹고 살기 바쁘고, 남들보다 성공하기 위해, 급변하는 세상에 뒤처지지 않기 위해 숨차게 달려야만 하는 세상이다. 성공과 성취의 야망이 구름처럼 하늘을 떠다니고, 지금 승부를 보지 않으면 늦는다는 조급함에 조금도 쉴 틈이 없다. 심지어 결혼도 성공에 걸림돌이 된다면 미루거나 포기할 정도로 성공강박증에 시달리기도 한다. 그러다 늦은 밤 현관문을 따고 들어서서 인기척이라곤 없는 집안 찬 공기에 코끝이 시릴 때, 자신을 맞아 줄 아무도 없다는 게 견딜 수 없어 켜놓은 TV에서 감정이 배제된 아나운서의 목소리가 들려오고, 그 소리만이 유일한 사람의 소리임을 알게 될 때, ‘내가 왜 이렇게 정신없이 살고 있지? 무엇을 위해? 무슨 영화를 누리겠다고 이렇게 살고 있을까?’ 하는 의문이 들지는 않는가?

문득 모든 것이 무의미해지고 도대체 왜 살아야 하는지를 모르겠다는 생각이 들 때, 눈을 감고 10년 후 나의 모습을 그려보라. 10년 후의 나의 모습은 어떠한가? 그토록 바쁘게 내달려온 보람은 있는가? 나는 행복한가, 아니면 여전히 잠시의 여유도 없이 내달리고 있는가? 내가 목표로 했던 지점에 가까이 와 있기는 한가?



모든 것은 꿈에서 시작된다. 먼저 꿈을 가져라.
인간은 의미를 추구하는 동물이다. 따라서 아무리 많은 재산이나 높은 지위를 얻었다고 해도 그로부터 삶의 가치나 의미를 발견하지 못한다면 그 삶은 공허하게 느껴진다. 인간은 또한 꿈을 통해서 가치를 추구하고 실현시키는 방법을 배우고 실천해간다. 앙드레 말로의 말처럼, ‘모든 것은 꿈에서 시작된다. 꿈 없이 가능한 일은 없다. 먼저 꿈을 가져라. 오랫동안 꿈을 간직하는 사람은 그 꿈을 닮아간다.’

사람들은 흔히 타인이 이룬 성공의 신화를 읽으면서 원대한 꿈을 꾸곤 한다. 성공의 길을 알려준다고 하는 자기계발서들은 하나같이 큰 꿈을 가지라고, 그러면 이루어질 것이라고 격려하기도 한다. 대통령이 되는 꿈, 크게 성공한 사업가가 되는 꿈, 백만장자가 되는 꿈 등 사람들의 꿈은 크고 다양하다. 그러나 이루기 어려운 큰 꿈은 오히려 좌절과 우울의 원인이 될 수 있다는 것을 사람들은 알지 못한다. 또한 물질적 성공만이 유일한 성공의 척도가 된 현대 사회에서 물질적 성공에 대한 꿈은, 꿈이라기보다 헛된 욕망일 뿐이다. 채워도 채워도 채워지지 않는 물질에의 욕망은 그 끝을 알기 어려울 뿐만 아니라 삶을 공허하게 만드는 요인이다. 요컨대 인간은 물질적 욕망을 통해서는 삶의 의미와 가치를 추구할 수 없기 때문이다.



미래의 원대한 꿈, 구체적이고 현실적인 목표
‘우리 모두 리얼리스트가 되자. 그러나 가슴에는 불가능한 꿈을 꾸자.’ 체 게바라는 이렇게 말했다. 나 역시 그의 말에 동의한다. 그의 말처럼 우리는 ‘불가능한 꿈을 꾸는 리얼리스트’가 되어야 한다. 그러려면 현재는 불가능해 보일지라도 미래를 향한 원대한 꿈을 가져야 한다. 그 꿈은 크게 가질수록 좋다. 구체적이고 물질적인 성공에 대한 꿈이 아닌 큰 삶의 가치를 꿈꾸자. 만일 그 원대한 꿈이 당장 떠오르지 않는다면 우리가 가장 행복한 순간의 모습을 그려보자. 그것이 우리 인생의 방향과 목적을 설정하는 데 지침이 될 수 있다.

미국의 오바마 대통령은 어릴 적 최초의 흑인 대통령을 꿈꿨다고 한다. 그의 목표는 대통령 그 자체가 아니라 ‘흑인과 가난한 사람들에게 꿈을 심어줄 수 있는’ 최초의 흑인 대통령이었다. 반기문 유엔 총장은 가난한 농가에서 어린 시절을 보내면서 이다음에 크면 국가를 위해서 큰일을 하는 사람이 되겠다는 꿈을 꾸었다. 그래서 그는 현재 국가의 위상을 높이고, 전 세계 평화를 위해서 일하는 UN 총장이 되었다.

미래의 원대한 꿈은 우리를 이끌고, 구체적이고 현실적인 목표는 우리를 움직이게 한다. 이 두 가지의 꿈은 우리 삶에 의미와 가치를 부여해줄 뿐만 아니라 기쁨과 활력을 더해준다. 미래의 목표를 위해 현재의 삶을 희생해서는 안 된다. 현재에 만족하고, 행복을 만끽하며 더 행복한 미래를 향해 나아가는 것이 바로 우리가 사는 이유이다.


먼 곳 바라보기, 삶의 균형을 잡아주는 등대의 역할
현대인은 욕망을 꿈꾼다. 욕망을 향한 경쟁은 끝이 없고, 그 경쟁에는 가속도가 붙는다. 욕망을 향해 가는 현대인의 삶은 시간이 아니라 분초를 다투게 된다. 일초라도 더 빨리 달리기 위해 전력을 다해 달리다보면 내가 지금 어디로 가고 있는지 그 방향과 목표를 잊어버릴 수 있다. 처음의 목표는 사라지고 오직 달리는 것 자체, 남들보다 빨리 달리는 것만이 목적이 되어 어디로 가는지도 모른 채 사람들 무리에 끼어 숨차게 달리고 있는 자신을 발견하게 되는 것이다. 방향을 잃고 달리는 무리 속에 있는 나를 발견하게 될 때, 한 번 멀리 미래를 내다보자. 잠시 멈춰서 내가 가고자 하는 방향을 확인해 보자. 우리가 사는 목적은 남들보다 먼저 성공이라는 기착점에 도달하기 위해서가 아니지 않는가! 그럼에도 지금 여기서의 행복과 미래의 계획 모두를 담보로 내놓고 오직 속도에 중독되어 목적 없이 달리고 있는 건 아닌지 나의, 우리의 삶을 되돌아보자.

먼 곳 바라보기, 그것은 초심을 잃지 않도록 할 뿐 아니라, 삶의 균형을 잡아주는 등대의 역할을 한다. 정신없이 달리고 있을 때 가끔 고개를 들어 하늘을 보자. 그리고 10년 후 나의 모습을 그려보자. 그것이 우리가 방향을 잃지 않고 행복을 찾아가는 유일한 길임을 잊지 말자.



-- 발췌 : 김혜남의 심리카페(국민은행)

2010/01/16 19:13 2010/01/16 19:13

java Server IP 얻기

Dev 2009/10/23 15:42
JSP 상에서 서버 IP를 얻기 위해 메모.

String serverIP = java.net.InetAddress.getLocalHost().getHostAddress();

2009/10/23 15:42 2009/10/23 15:42

IE7 기본 검색 추가

ETC 2009/10/23 12:52
Internet Explorer에 검색 공급자 추가 페이지 방문(http://www.microsoft.com/windows/ie/searchguide/ko-kr/default.mspx?dcsref=http://runonce.msn.com/runonce2.aspx)


직접 만들기의 URL에 아래 URL을 붙어 넣고 '설치'를 클릭한다.

http://www.google.co.kr/search?complete=1&hl=ko&q=TEST&btnG=Google+%EA%B2%80%EC%83%89&lr=&aq=0
2009/10/23 12:52 2009/10/23 12:52
일반적으로 윈도우의 탐색기를 실행시키면 기본으로 홈폴더의 내문서로 이동된다.

하지만, 속성에서 설정을 변경해서 내컴퓨터로 바로 이동할 수 있는 방법이 있다.

탐색기를 마우스 오른쪽 버튼을 클릭해 속성을 보면
바로가기 탭에 "대상(T) :" 입력란이 있다.
이 입력란을 아래와 같이 변경해 주면 된다.
%SystemRoot%\explorer.exe /e,::{20D04FE0-3AEA-1069-A2D8-08002B30309D}
또는
%windir%\explorer.exe /e,::{20D04FE0-3AEA-1069-A2D8-08002B30309D}

2009/10/21 14:05 2009/10/21 14:05

java 기본자료형

Dev 2009/10/15 15:20

논리형 자료형 : boolean
특징 : 형변환 불가

정수형 자료형 :
1. byte : 1byte (-128 ~ 127)
2. short : 2byte ( -32768 ~ 32767)
3. char : 2byte ( 0 ~ 65535 )
4. int : 4byte ( -2147483648 ~ 2147483647 )
5. long : 8byte (-922경 ~ 922경)

실수형 자료형
1. float : 4byte
2. double : 8byte

2009/10/15 15:20 2009/10/15 15:20

java System.arraycopy()

Dev 2009/10/15 12:59
public static void main(String[] args) {

    String[] arr1 = {"영", "일", "이", "삼", "사", "오" };
    String[] arr2 = {"0", "1", "2", "3", "4", "5" };
 
    System.arraycopy(arr1, 0, arr2, 0, 3);

    //System.arraycopy(원본배열, 복사를 시작할 원본 요소위치(숫자), 복사할 배열, 복사를 받을 때 위치, 원본배열의 복사 원소 개수)

    System.out.println(Arrays.toString(arr2));
    // System.out.println(Arrays.toString(배열명));
    //==> 배열의 원소를 출력해 준다. (루프문으로 출력을 안해줘도 되는 간편한 방법이다.)
}



// 출처 : http://ppittagi.pe.kr/

2009/10/15 12:59 2009/10/15 12:59