2012-11-23

jquery] jqgrid plugin 사용



원본출처 :  http://dev.henjjang.com/414

jqGrid를 기억하고자 이번 포스팅을 작성한다. jqGrid 사이트 와 데모사이트를 통해서 관련된 여러정보를 얻을 수 있지만 사용했던것을 정리하지 않으면 기억했던것을 또 찾아야 하는 일이 되풀이 되곤한다.

버전

- 최근(2010.07.12)에 릴리즈 된 버전이 3.7.2 버전이다. 3.7.2 버전에서 변화된 내용은 다음에서 확인할 수 있다. 3.7 버전은 다음의 내용을 담고 있다.

 
+ Load array data at once
+ Load at once from server
+ Single search
+ Multiple search
+ Virtual scrolling
+ Toolbar search
+ Add/edit/delete on local data
 

- 2010.8월 Grouping 이 가능한 jqGrid 3.8 Beta 버전을 공개했다.



jqGrid 시작하려면

 
- jqGrid 를 시작하려면 jQuery를 알아야 한다. javascript 프레임워크, 또는 라이브러리라고 부를 수 있는 jQuery 에 대해서는 추후 정리해야겠다. 

 
<!-- BEGIN: load jQuery UI theme -->
<link type="text/css" href="./css/themes/ui-lightness/jquery-ui-1.8.2.custom.css" rel="stylesheet" /><!-- END: load jQuery UI theme -->
<!-- BEGIN: load jQuery -->
<script type="text/javascript" src="./js/jquery-1.4.2.js"></script>
<!-- END: load jquery -->

<!-- BEGIN: load jQuery UI-->
<script type="text/javascript" src="./js/jquery-ui-1.8.2.custom.min.js"></script>
<!-- END: load jQuery UI-->
 
[code 1 : jquery theme, jquery ui, jquery 선언부]

[code 1] 은 ui-lightness 테마를 적용하고, jquery ui, jquery 관련되어 선언하는 부분이다. 





jqGrid 시작하기

 
- jqGrid 시작하기


jqGrid 다루기

 
- jqGrid 다루기

* id가 13 인 값을 선택한다.
jQuery("#list9").jqGrid('setSelection',"13");<font class="Apple-style-span" color="#333333" face="굴림"><span class="Apple-style-span" style="line-height: 18px; white-space: normal;"><font class="Apple-style-span" color="#222222" face="monospace"><span class="Apple-style-span" style="line-height: 15px; white-space: pre;"><br /> </span></font></span></font>

참고사이트

 
jQuery Grid Plugin site

jquery] jqGrid 설치 시 꼭 신경써야 할 것



원본 출처 :: http://comnori.blogspot.com/2011/07/jqgrid.html



jqGrid 설치 시 꼭 신경써야 할 것


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>My First Grid</title>
 
<link rel="stylesheet" type="text/css" media="screen" href="css/ui-lightness/jquery-ui-1.7.1.custom.css" />
<link rel="stylesheet" type="text/css" media="screen" href="css/ui.jqgrid.css" />
 
<script src="js/jquery-1.4.2.min.js" type="text/javascript"></script>
<script src="js/i18n/grid.locale-en.js" type="text/javascript"></script>
<script src="js/jquery.jqGrid.min.js" type="text/javascript"></script>
 
</head>
<body>
...
</body>
</html>

원문 사이트 : http://www.trirand.com/jqgridwiki/doku.php?id=wiki:how_to_install

1. 위에 나온 css, js 파일을 반드시 사용한다.

2. 스크립트 소스 순서는
grid.local-en.js (언어에 따라 en 부분은 바뀔 수 있음)가
jquery.jqGrid.min.js 보다 무조건 위에 선언되어야 한다.

이게 안되면 pager 부분이 작동하지 않는다.

java/flex] swf 로 변수 전달 방법


원본출처 : http://ejihong.egloos.com/9462626


[AS 3.0] swf 로 변수 전달 방법


swf 내부에서 통신 서비스 객체를 이용하여 외부의 데이터를 불러들일 수 있습니다.

그러면 외부에서 swf 로 데이터를 전달할려면?

웹에서 GET 방식으로 전달하는 것 처럼 fileName.swf?key1=value1&key2=value2 이렇게 전달 가능합니다.

또는 <object> 태그 내에 <param name="flashVars" value="key1=value1&key2=value2"/> 를 넣으면 됩니다.
<object id='swf' classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' codebase='http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab' height='100%' width='100%'>
        <param name='src' value='fileName.swf'/>
        <param name='flashVars' value='key1=value1&key2=value2'/>
        <embed name='swf' src='fileName.swf' pluginspage='http://www.adobe.com/go/getflashplayer' height='100%' width='100%' flashVars='key1=value1&key2=value2'/>
</object>


그리고 그 값을 사용하는 방법은...

Flash
var param1:String = loaderInfo.parameters.key1;
var param2:String = loaderInfo.parameters.key1;

Flex 3
var param1:String = Application.application.parameters.key1;
var param2:String = Application.application.parameters.key2;

Flex 4
var param1:String = parameters.key1;
var param2:String = parameters.key2;


java/Flex]eclipse 3.5( galileo) 와 Flex Builder 3 setting



원본출처 :  http://dongchimi.unfix.net/v2/?p=66



Eclipse Ganymede 버전까지 지원하는 FlexBuilder를 Eclipse 3.5 버전에서 사용할 방법을 찾아보다 아래의 방법을 찾아내었다.
1.먼저 Eclipse Galileo(3.5) 를 설치한다.
  1. FlexBuilder를 앞에서 설치한 Eclipse를 타겟으로 설치한다. (이때 나오는 버전 체크 문제는 간단히 무시한다.)
    3. 설치 후 Eclipse를 실행하여 Flex Perspective 를 찾는다. 당연히 없다.
    4. Eclipse를 종료한 후 Eclipse 홈의 links 디렉토리에 있는 com.adobe.flexbuilder.feature.core.link 파일을 확인한다.
    5. path=%EclipseHome%/%FlexBuilderHome% 이라고 수정한다. (예:path=C:/flowerzip/FlexBuilder3-Plugin) ‘path=’ 를 꼭 입력하는게 중요!
     예를 들어  c:\dev\FlexBuilder3  에 설치를 한 경우 
    path=c:\dev\FlexBuilder3 으로 변경하면 된다.

    6. Eclipse 를 다시 실행하여 Flex Perspective 를 확인한다. (제대로 확인해본다.)
    7. Preference의 Flex에서 installed SDK를 확인하여 Flex SDK가 제대로 잡혔는지 확인한다.
끝.
추신 :
위와 같이 실행 한 후 Flex3Plugin 파일을 따로 보관해 두면 플렉스 플러그인을 삭제 했을 시 다시 설치할 필요가 없다. 이클립스에 links 디렉토리를 생성하여 위의 link 파일을 만들어 두고, Eclipse의 SDK를 수정해두면 끝.

2012-11-09

windows 7 에서 글꼴 설치하기


Windows 7 에서 글꼴을 추가적을 설치할 경우 아래 절차로 하면 된다.

1. 설치하고자 하는 글꼴을 선택
2. 마우스 오른쪽 버튼 클릭
3. 설치 선택.
4. 설치 진행 사항 확인.
5. 글꼴 설치 확인
    %system%\windows\fonts\ 디렉토리에 설치하고자 했던 글꼴 파일이 존재하는지 확인하면 끝.

2012-11-06

오라클에서 copy_t 테이블 및 데이터 입력 쿼리문


--// 오라클에서 copy_t 테이블 및 데이터 입력 쿼리문
create table copy_t(no number, no2 varchar2(2)) nologging;

insert into copy_t values (1 ,'01');
insert into copy_t values (2 ,'02');
insert into copy_t values (3 ,'03');
insert into copy_t values (4 ,'04');
insert into copy_t values (5 ,'05');
insert into copy_t values (6 ,'06');
insert into copy_t values (7 ,'07');
insert into copy_t values (8 ,'08');
insert into copy_t values (9 ,'09');
insert into copy_t values (10 ,'10');
insert into copy_t values (11 ,'11');
insert into copy_t values (12 ,'12');
insert into copy_t values (13 ,'13');
insert into copy_t values (14 ,'14');
insert into copy_t values (15 ,'15');
insert into copy_t values (16 ,'16');
insert into copy_t values (17 ,'17');
insert into copy_t values (18 ,'18');
insert into copy_t values (19 ,'19');
insert into copy_t values (20 ,'20');
insert into copy_t values (21 ,'21');
insert into copy_t values (22 ,'22');
insert into copy_t values (23 ,'23');
insert into copy_t values (24 ,'24');
insert into copy_t values (25 ,'25');
insert into copy_t values (26 ,'26');
insert into copy_t values (27 ,'27');
insert into copy_t values (28 ,'28');
insert into copy_t values (29 ,'29');
insert into copy_t values (30 ,'30');
insert into copy_t values (31 ,'31');
insert into copy_t values (32 ,'32');
insert into copy_t values (33 ,'33');
insert into copy_t values (34 ,'34');
insert into copy_t values (35 ,'35');
insert into copy_t values (36 ,'36');
insert into copy_t values (37 ,'37');
insert into copy_t values (38 ,'38');
insert into copy_t values (39 ,'39');
insert into copy_t values (40 ,'40');
insert into copy_t values (41 ,'41');
insert into copy_t values (42 ,'42');
insert into copy_t values (43 ,'43');
insert into copy_t values (44 ,'44');
insert into copy_t values (45 ,'45');
insert into copy_t values (46 ,'46');
insert into copy_t values (47 ,'47');
insert into copy_t values (48 ,'48');
insert into copy_t values (49 ,'49');
insert into copy_t values (50 ,'50');
insert into copy_t values (51 ,'51');
insert into copy_t values (52 ,'52');
insert into copy_t values (53 ,'53');
insert into copy_t values (54 ,'54');
insert into copy_t values (55 ,'55');
insert into copy_t values (56 ,'56');
insert into copy_t values (57 ,'57');
insert into copy_t values (58 ,'58');
insert into copy_t values (59 ,'59');
insert into copy_t values (60 ,'60');
insert into copy_t values (61 ,'61');
insert into copy_t values (62 ,'62');
insert into copy_t values (63 ,'63');
insert into copy_t values (64 ,'64');
insert into copy_t values (65 ,'65');
insert into copy_t values (66 ,'66');
insert into copy_t values (67 ,'67');
insert into copy_t values (68 ,'68');
insert into copy_t values (69 ,'69');
insert into copy_t values (70 ,'70');
insert into copy_t values (71 ,'71');
insert into copy_t values (72 ,'72');
insert into copy_t values (73 ,'73');
insert into copy_t values (74 ,'74');
insert into copy_t values (75 ,'75');
insert into copy_t values (76 ,'76');
insert into copy_t values (77 ,'77');
insert into copy_t values (78 ,'78');
insert into copy_t values (79 ,'79');
insert into copy_t values (80 ,'80');
insert into copy_t values (81 ,'81');
insert into copy_t values (82 ,'82');
insert into copy_t values (83 ,'83');
insert into copy_t values (84 ,'84');
insert into copy_t values (85 ,'85');
insert into copy_t values (86 ,'86');
insert into copy_t values (87 ,'87');
insert into copy_t values (88 ,'88');
insert into copy_t values (89 ,'89');
insert into copy_t values (90 ,'90');
insert into copy_t values (91 ,'91');
insert into copy_t values (92 ,'92');
insert into copy_t values (93 ,'93');
insert into copy_t values (94 ,'94');
insert into copy_t values (95 ,'95');
insert into copy_t values (96 ,'96');
insert into copy_t values (97 ,'97');
insert into copy_t values (98 ,'98');
insert into copy_t values (99 ,'99');

commit;


=================================================================
copy_ymd 테이블 생성 및 데이터 입력 스크립트 ( 오라클용)

create table copy_ymd nologging
as
select to_char(sysdate+rownum, 'YYYYMMDD') ymd,
to_date(to_char(sysdate+rownum, 'YYYYMMDD'), 'YYYY-MM-DD') ymd_date
from tab a, tab b, tab c
where rownum < 100000
union all
select to_char(sysdate+rownum, 'YYYYMMDD') ymd,
to_date(to_char(sysdate+rownum, 'YYYYMMDD'), 'YYYY-MM-DD') ymd_date
from dual
union all
select to_char(sysdate-rownum, 'YYYYMMDD') ymd,
to_date(to_char(sysdate-rownum, 'YYYYMMDD'), 'YYYY-MM-DD') ymd_date
from tab a, tab b, tab c
where rownum < 100000
union all
select '00010101' ymd, to_date('00010101') ymd_date from dual
union all
select '99991231' ymd, to_date('99991231') ymd_date from dual;

COMMIT;
=================================================================
copy_yy 테이블 생성 및 데이터 입력 스크립트 ( 오라클용)

create table copy_yy nologging
as
select to_char(1900+rownum) yy from all_objects where rownum < 200


commit;



=================================================================
잘못된 날짜 데이터 찾기

SELECT A.EMPNO, A.ENAME, A.HIREDATE, B.YMD -- TO_DATE(HIREDATE, 'YYYY-MM-DD')
FROM TEST20 A, COPY_YMD B
WHERE A.HIREDATE = B.YMD(+)
AND B.YMD IS NULL;

혹은

SELECT * FROM (
SELECT A.EMPNO, A.ENAME, A.HIREDATE,
(SELECT B.YMD FROM COPY_YMD B WHERE A.HIREDATE = B.YMD ) YMD
FROM TEST20 A
)
WHERE YMD IS NULL;

( TEST20 테이블의 HIREDATE는 VARCHAR2(8) 로 구성되어 있으며, 중간중간 잘못된 데이터가 입력되어 있음)

2012-11-04

오라클] DB User 별 권한 할당 관계 확인하는 쿼리


/* --------------------------------
    용도        : DB User 별 권한 할당 관계 확인하는 쿼리
    작업순서    : SYS(DBA권한)으로 로그인 해서 작업
    update Date : 2009.04.29
    update By   : 정봉수
-------------------------------- */
select  OWNER         --// 소유자
, grantee          --// 권한을 부여 받은 사용자
, MAX(decode(privilege, 'INSERT', 'O','')) PRIV_INS  --// INSERT 권한
, MAX(decode(privilege, 'UPDATE', 'O','')) PRIV_UPD  --// UPDATE 권한
, MAX(decode(privilege, 'DELETE', 'O','')) PRIV_DEL  --// DELETE 권한
, MAX(decode(privilege, 'SELECT', 'O','')) PRIV_SEL  --// SELECT 권한 
, MAX(decode(privilege, 'EXECUTE', 'O','')) PRIV_EXE  --// EXECUTE 권한
from dba_tab_privs
where owner NOT LIKE '%SYS%' --// SYS 사용자는 제외하기 위한 조건
GROUP BY OWNER, GRANTEE
ORDER BY OWNER
;

2012-11-03

FreeBSD/MySQL]FreeBSD5.3.1R 에서 mysql4.x 설치하기

이글은 FreeBSD 5.3R 에서의 포트시스템으로의 설치를 기본으로 합니다.
1. 디렉토리 이동
# cd /usr/ports/databases/mysql41-server

--> mysql 버전이 5.x 가 있지만 proftpd포트 설치시 mysql4.x 클라이언트

를 설치하므로 버전을 맞추기 위해 4.x 를 설치하기로 합니다.

# make install clean WITH_CHARSET=euc_kr BUILD_OPTIMIZED=yes

(

mysql41-server 의 경우 WITH_CHARSET옵션의 값이 euckr로 변경됨.

mysql 4.1버전의 경우

# make install clean WITH_CHARSET=euckr BUILD_OPTIMIZED=yes

)

# /usr/local/bin/mysql_install_db

==> 처음으로 mysql을 사용하기 전에 시스템 DB를 만들기 위한 스크립트를

실행합니다.

위 명령은 mysql을 설치한 후 반드시 한번만 하시기 바랍니다.



2. 설치 확인 작업

# /usr/local/bin : mysql바이너리 파일들이 있나 확인

# /usr/local/etc/rc.d/mysql-server.sh : mysql 기동 스크립트

# /var/db/mysql : mysql 데이터베이스 파일



3. 데몬 시작및 중지하기

3.1. 시작하기

# /usr/local/etc/rc.d/mysql-server.sh start 혹은

/usr/local/bin/mysqld_safe -user=mysql &



3.2 중지하기

# /usr/local/etc/rc.d/mysql-server.sh stop 혹은

/usr/local/bin/mysqladmin -u root shutdown



4. mysql 데이터베이스를 사용하기 전에

반드시 루트 암호를 생성하고 사용하시기 바랍니다.

#/usr/local/bin/mysqladmin -u root password '새로운 비밀번호'

#/usr/local/bin/mysqladmin -u root -h 호스트명 password '새로운 비밀번호'



5. 데이터베이스 사용하기

#/usr/local/bin/mysql -u root -p

password :




** 만약 위와같이 작업시 에러발생하는 경우


4번 작업시 에러발생시에는

1. 우선 mysql서버 데몬을 죽인다.

# kill mysql_pid 혹은

/usr/local/etc/rc.d/mysql-server.sh stop



2. /usr/local/etc/rc.d/mysql-server.sh 파일을 편집해서

========================

편 집내용.

/usr/local/bin/mysqld_safe --user=mysql --datadir=${DB_DIR}
--pid-file=${PIDFILE} --language=korean > /dev/null &

를 다음과 같이 수정합니다 .

/usr/local/bin/mysqld_safe --user=mysql --datadir=${DB_DIR}
--pid-file=${PIDFILE} --language=korean --skip-grant > /dev/null &



========================



3. mysql서버 데몬을 다시 시작한다.

# /usr/local/etc/rc.d/mysql-server.sh start



4. 위와같이 하면 권한 테이블을 사용하고 데몬을 띄우게 됩니다.

5. mysql에 접속하여

# /usr/local/bin/mysql -u root -p

6. root의 암호를 변경합니다.

mysql> use mysql;

mysql> select * from user where user = 'root';

mysql> update user SET password = PASSWORD('newpassword');

7. 권한 테이블을 다시 읽는다.

mysql> flush privileges;

8. mysql을 종료

mysql> \q



9. mysql 서버 데몬 죽입니다.

#/usr/local/etc/rc.d/mysql-server.sh stop



10./usr/local/etc/rc.d/mysql-server.sh 파일을 편집해서

========================

편집내용.

/usr/local/bin/mysqld_safe --user=mysql --datadir=${DB_DIR}
--pid-file=${PIDFILE} -language=korean --skip-grant > /dev/null &

를 다음과 같이 수정합니다 .

/usr/local/bin/mysqld_safe --user=mysql --datadir=${DB_DIR}
--pid-file=${PIDFILE} -language=korean > /dev/null &



========================

다 시 원상복귀 합니다.



11. mysql 서버를 다시 시작합니다.

#/usr/local/etc/rc.d/mysql-server.sh start



12. 정상적으로 mysql을 사용가능합니다.

FreeBSD/MySQL] FreeBSD 5.4R 에서 MySQL 한글 입력 문제


FreeBSD 5.4R에서 ports 에서 mysql-server41 을 설치시 

make install clean WITH_CHARSET=euckr로 설치후

한글 입력이 안되는 문제가 발생한다 

그런경우 아래와 같이 해당 계정에서 작업을 한다. 



///////////////////////////////////////////////////////////////////////////////

MySQL 클라이언트 프로그램(mysql)에서 한글 입력에 문제가 있을 수 있습니다.

mysql은 readline 라이브러리를 사용하므로, 사용자 디렉토리의 .inputrc에

다음 내용을 넣어주면 됩니다.



set meta-flag On

set convert-meta Off

set output-meta On




///////////////////////////////////////////////////////////////////////////////

이글은 최준호님이 답해주셨습니다.

DB/MySQL] mysql 유지보수 MYD,MYI,FRM


[[[ SQL 자료의 이전과 dump ]]]
table dump (특정 테이블을 sql 문으로 저장하기)
./mysqldump -u ID -p DBname tablename > tablename.sql
-------------------------------------------------------------------------
특정 table 설치
./mysql -u ID -p DBname < table.sql

--------------------------------------------------------------------------
특정 테이블 지우기
./mysql -u DBname -p
./use DB
./drop table tablename;

---------------------------------------------------------------------------
DB 을 모두 sql Dump 백업
./mysqldump -u ID -p DBname > ***.sql
./mysql -u ID -p DB < ***.sql

***********************************************************
 [[[[[[[[[[[ 테이블의 유지 보수 ]]]]]]]]]]]]]]]]]]]]]]
전원중단,비정상종료,frm화일 삭제수정등에 의한 DB 이상
mysql 의 테이블 검사 및 오류를 수정하는 유틸리티
* myisamchk 를 사용시 mysql를 종료한다.
* 테이블은 3개 화일 : frm, MYI, MYD 파일을 검사한다.
   frm(테이블구조기록), MYI(테이블인덱스화일), MYD (데이터화일)
------------------------------------------------------------------------
myisamchk table명 (table 조회 검색)
myisamchk --recover --quick table명 (빠른복구)
myisamchk --recover table명 (복구)
myisamchk --safe-recover table명 (재오류시)

-------------------------------------------------------------------------
복 구되지 않는 경우
-테이블구조가 기록된 frm 파일이 삭제 또는 손상
-테이블 인덱스 파일은 MYI 삭제 손상된 경우
-MYD 는 데이터 파일

---------------------------------------------------------------------------
myisamchk -r table명
(테이블 파일의 빈공간등을 없에 최적화 시킨다.)
-a : 흩어진 인덱스를 모아 속도 향상
-S : 인덱스트리 소팅 검색 속도 향상
-R : 인덱스 기준 레코드 정렬 속도 향상
      myisamchk -R1 tablename
      * 1번 인덱스 기준 레코드 정렬

-----------------------------------------------------------------
[[[[[[ EXCEL 에 있는 자료 mysql로 이전하기 ]]]]]]]
1. 엑셀의 화일을 파일형식-텍스트(탭으로분리)로 선택 저장
    * sample.txt
  ex) 허정수  A  경기도
        이효진  B  구리시
2. FTP 로 전송후 LOAD DATA INFILE 명령으로 테이블 입력
    * 미리 테이블이 생성되어 있어야 한다.
    * 해당 txt 에 맞게 테이블을 만들어 주세요!
3.LOAD DATA INFILE 'sample.txt'  INTO TABLE sample
   LINES  TERMINATED BY '\r\n' ;
   * '\r\n' 줄구분차이 도스 윈도우
4. select * from sample;


----
복구하는 방법은 ...
mysql data 디렉토리에 그냥 같다가 놓는겁니다 ^^

.frm 파일은 테이블 구조가 저장되어 있는 파일입니다
.MYD 파일은 실제 데이터가 들어있는 파일입니다
.MYI 파일은 Index 정보가 들어가 있는 파일입니다


위 3개의 파일을 손상되지 않은 상태에서 가지고 계신다면
그냥 갖다가 놓는것 만으로 복구하실 수 있습니다
단, 퍼미션 조절은 해주셔야겠지요. 퍼미션 조절 안하시면 나중에 DB 파일을 읽어오지 못합니다

그리고 저 파일들을 .sql 형태로 변환하는 방법은 없습니다
적 어도 제가 알기론요..
다만
백업받으실때 .sql 형태로 백업받을 수는 있습니다

mysqldump -A -u root -p > mysql_bakup_all.sql

이렇게 하시면 모든 데이터베이스를 .sql 형태로 백업받게 됩니다
특 정 DB 만, 혹은 특정 Table 만 백업받는 방법은
Mysql 메뉴얼을 참조하시구요..
더 자세한 답변은 여기 계신 고수분들께서 해주실겁니다
그리고
database.sarang.net 사이트로 한번 들려보세요

DB/MSSQL] convert/ cast 함수



 mssql의 convert()/cast() 함수 


convert(), cast() 는 둘다 데이터를 표현할때 변환해서 보여주는 함수로 cast()는 ansi sql을 지원한다.

convert(datatype[length], expression, [style])

cast(expression as datatype)
   expression : 표현식, 테이블의 필드, 문자열 등이 올 수 있다.
   datatype : sql에서 지원하는 데이터타입을 말한다. int, char(), varchar() 등등...
   style : expression이 datetime 형식일 경우 주로 사용되는 것으로 각 나라의 표현 형식을 지정할 때 사용한다. 

한국의 경우 주로 121, 21이 사용되는 경우가 많다.


예제) titles 테이블에서 제목과 판매일자를 가지고 온다.

SELECT SUBSTRING(title, 1, 25) AS Title, CAST(ytd_sales AS char(2))
FROM titles

WHERE type = ''trad_cook''

DB / MSSQL ] 인덱스를 이용한 조건검색



인덱스의 유무에 따라서 데이터를 찾는 성능의 차이가 천차만별이 될 수도 있으나 또한 너무 남용을 하게 되면 데이터의 크기보다 인덱스의 크기가 커지는 배보다 배꼽이 더 큰경우가 발생하는 경우도 있으니 유의해서 사용을 해야된다.

인덱스는 테이블에서 어느 하나의 필드, 혹은 필드들의 조합으로 생성을 할 수 있다.
이 생성된 인덱스를 사용하게 하는 것이 쿼리 작성자의 능력이다.

이제 조건 검색에서 주의할 사항을 알아보자.

1. 조건검색시 ''='' 은 모든 인덱스검색중 최우선 순위를 가진다.

2. 조건 검색시 좌변인덱스는 가공하지 말고, 우변을 가공해서 조건을 생성할 것.
    단, 의도적인 인덱스 사용을 막고자 하는 경우는 예외.


3. 조건 검색시 부정의 표현을 사용하지 말고 긍정표현 및 범위 조건을 사용할것.
     다시말해,  ''not'', ''<>'', ''or'' 이런 조건들은 될 수 있으면 긍정적인 표현으로 바꾸어서 사용할 것.
     ''<>'' => exists로 대체,  ''not'' A => not (A) 대체 

4. 인덱스가 있는 곳과 없는곳의 테이블을 조인하여 결과 검색시, 인덱스가 없는곳의 데이터가 먼저 읽혀지고 다음에 인덱스가 있는 테이블의 데이터가 읽혀진다.

5. 가급적 조건에 ''Null'', ''Not Null'' 을 없애기 위해 테이블 설계시, 결합인덱스의 구성컬럼이 된다면 Not Null로, 또한 입력조건값으로 자주 사용되는 것이면 Not Null로 설계를 하여서 조건검색시 Not Null, Null이란 조건을 가급적 없앤다.


위의 사항만을 유념해서 검색을 하더라도 select 쿼리 수행 시간을 줄일 여지가 많이 있다.

===========================================================================


쿼리문의 속도 향상 방법.

부분범위처리를 사용한다.

부분범위처리란

 - 조건을 만족하는 전체집합이 아닌 일부분만을 Access 하게 하는것
 - Data량이 많아도 퍼포먼스에는 지장이 없고, 오히려 향상을 가져올 수도 있다.
 - 인덱스나 클러스트를 적절히 활용하여 sort를 대체가능하다.
 - table은 액세스하지 않고 index만 사용하도록 유도
 - exists를 활용한다.
 - query를 이원화 하여 일부분씩 scan하도록 유도


위의 것들을 조합하여 활용하면 쿼리문을 작성하여 대량의 데이터를 처리할 경우에도 무리없이 원하는 속도를 얻을 수 있을 것이다.

DB] DB2에서 merge into 사용


merge 문장의 문법 :

merge into tableA  a
using (
select * from tableB
) b
  on (   a.aaa = b.bbb  --// 조회 조건.
     )
 when matched then
                      update 문장. <== tableA에 업데이트할 항목 나열
when not matched then
                      insert 문장.   <== tableA에 insert 할 항목 나열.
else ignore;


설명 :
 merge into 문장은 insert / update 작업을 한번에 할 수 있는 장점이 있는 sql 구문이다.
그러나, 사용상 주의점은 b 로 묶인 select 문장의 조회 결과가 없는 경우, when 조건절에 걸리지 않는 상황이 발생하는걸 경험했다.


현재까지의 결론.
 1. merge into 는 tableA 에 대해 insert / update 작업을 한번에 수행한다. 
    단, a.aaa = b.bbb 가 일치하는 항목에 대해.
 2. merge into 는 "select * from tableB" 에서 조회 결과가 없으면 when ... 을 무시한다. 
    결과적으로 else ignore 가 실행되는 듯 하다. 


2012-10-31

java Framework]윈도우에서 톰캣5.0과 아파치2.0 그리고 jk2 연동하는 방법



<<윈도우에서 톰캣5.0과 아파치2.0 그리고 jk2 연동하는 방법   >>


우선 다음과 같은 S/W가 필요하다.
Apache2.0.45
J2SDK 1.4.1_02 (http://httpd.apache.org/download.cgi에서 apache_2.0.46-win32-x86-no_src.msi를 다운로드 )
Jakarta Tomcat4.1.24 (http://jakarta.apache.org/builds/jakarta-tomcat-4.0 /release/v4.1.24/bin/에서 jakarta-tomcat-4.1.24.exe 또는 jakarta-tomcat-4.1.24-LE-jdk14.exe를 다운로드합니다. J2SDK 1.4가 이미 설치되어 있다면 LE 버전만 받으면 됩니다. 그렇지 않다면 jakarta-tomcat-4.1.24.exe를 다운로드)
mod_jk2 (http://jakarta.apache.org/builds/jakarta-tomcat- connectors/jk2/release/v2.0.2/bin/win32/참고 윈도우용 mod_jk2-2.0.43.dll)
필 요한 소프트웨어를 모두 구했으면 각각을 설치한다. 가급적이면 설치는 J2SDK부터 설치하는 것이 좋다. 그 다음 아파치나 톰켓을 차례대로 설치하면 된다. JK2는 아파치 설치 후, modules 디렉토리에 mod_jk2-2.0.43. dll 파일을 복사하면 된다.


환경 설정

1) JAVA_HOME

JDK가 설치된 디렉토리를 JAVA_HOME 이라는 변수이름으로 환경변수에 추가한다. 바탕화면의 '내 컴퓨터'를 선택하고 팝업메뉴를 띄워 등록정보에 들어간 다음 ‘고급→환경변수’를 선택하면 된다. 모든 사용자에 관계없이 JAVA_HOME이 유효하게 하려면 시스템 변수에, 자신의 계정에만 유효하게 하려면 사용자 변수쪽에 추가하면 된다. 변수명은 JAVA_HOME으로 하고 변수값은 JDK를 설치한 디렉토리를 지정해주면 된다(예. C:\J2SDK_1.4.1_01). BIN 디렉토리까지 설정해주는 것이 아님을 기억하자.

JAVA_HOME 변수의 경우는 TOMCAT에서 JSP 컴파일 등을 할 때 사용할 뿐만 아니라 다른 자바관련 툴들(ANT같은)에서도 이 변수를 사용하므로 어떻든 간에 한번은 지정하는 것이 작업에 도움이 될 것이다.

2) CLASSPATH

TOMCAT 에서는 JSP를 컴파일 할 필요가 있을 때 JAVA_HOME에서 설정된 패스를 기준으로 lib 디렉토리를 뒤지거나 CLASSPATH 환경변수 설정을 참고해서 컴파일에 사용할 패키지인 servlet.jar를 찾는다. 따라서 servlet.jar를 $JAVA_HOME/jre/lib/ext 같은 곳에 넣어주거나 servlet.jar가 포함되어 있는 TOMCAT의 $TOMCAT_HOME/lib 디렉토리에 CLASSPATH 설정을 해주면 된다. 환경변수 설정하는 요령은 앞의 JAVA_HOME의 그것과 동일하다.

3) PATH

자바소스 컴파일에는 javac.exe가 사용되기 때문에, 이를 시스템 어디에서나 사용할 수 있도록 환경변수의 PATH에다가 $JAVA_HOME/bin 디렉토리를 추가해주면 된다. 자바프로그래머라면 대부분 이미 추가해 놓았으리라 생각한다.

4) 아파치 환경설정 - httpd.conf 와 workers2.properties

$APACHE/conf 디렉토리에 있는 httpd.conf 파일을 열고, LoadModule 이라고 되어있는 부분들을 찾아서 적당한 줄에다가 다음과 같이 입력한다.
LoadModule jk2_module modules/mod_jk2-2.0.43.dll

그 후에 DocumentRoot 항목을 찾아서 $TOMCAT_HOME/webapps과 같은식으로 지정해준다.
예) DocumentRoot "c:\Program Files\Apache Group\Tomcat 4.1\webapps"

그리고 아래쪽에 있는 Directory 항목 역시 동일하게 수정해준다.
예) <Directory "C:\Program Files\Apache Group\Tomcat 4.1\webapps">

다 끝냈으면 이번에는 workers2.properties를 편집한다. 이 파일은 기본적으로 아파치에 포함되지 않으므로 conf 폴더 내에서 찾을 수가 없다. 따라서 직접 만들어줘야 하는데 $APACHE_HOME/conf에다가 workers.properties 파일을 만들고 다음의 내용을 복사해넣고 저장하면 된다.
# Define the communication channel
[status:]
[uri:/jkstatus/*]
group=status:
[shm:]disabled=1
[channel.socket:localhost:8009]
info=Ajp13 forwarding over socket
tomcatId=localhost:8009

# Web Applicaton을 설정
[uri:/examples/*]
info=Map the whole webapp

위 에서 언급한 바와 같이 workers2.properties 파일은 $APACHE/conf에 있어야만 아파치가 읽어들일 수 있기 때문에 특히 파일의 경로에 주의해야 한다. ($TOMCAT_HOME/conf 가 아님)

5) 톰캣 환경설정 - jk2.properties 과 server.xml

$TOMCAT_HOME/conf/jk2.properties 파일을 열고 편집하면 되는데 내용을 잘 모른다면 다음의 셋팅예제를 그대로 복사해 써도 무방하다.
## THIS FILE MAY BE OVERRIDEN AT RUNTIME. MAKE SURE TOMCAT IS STOPED
## WHEN YOU EDIT THE FILE.
## COMMENTS WILL BE _LOST_
## DOCUMENTATION OF THE FORMAT IN JkMain javadoc.

# Set the desired handler list
handler.list=apr,channelSocket,request,shm
# Override the default port for the socketChannel
# Set the default port for the channelSocket
channelSocket.port=8009

# Default:
# channelUnix.file=${jkHome}/work/jk2.socket
# Just to check if the the config is working
# shm.file=${jkHome}/work/jk2.shm

# In order to enable jni use any channelJni directive
# channelJni.disabled = 0
# And one of the following directives:

# apr.jniModeSo=/opt/apache2/modules/mod_jk2.so

# If set to inprocess the mod_jk2 will Register natives itself
# This will enable the starting of the Tomcat from mod_jk2
# apr.jniModeSo=inprocess

# Dynamic library
serverRoot= "C:/Program Files/Apache Group/Tomcat/webapps "

완료했으면 이번에는 server.xml을 편집한다. $TOMCAT_HOME/conf/server.xml 파일을 열고 아래의 부분을 찾아 주석처리 하거나 삭제한다. 주석처리는 ‘<!-’로 시작해서 ‘->’로 끝내면 된다. 아래부분은 TOMCAT에 포함되어 있는 Coyote 웹서버에 연결하는 커넥터인데, 여기서는 웹서버로 아파치를 사용할 것이므로 필요없다.
<!--
<Connector className="org.apache.coyote.tomcat4.CoyoteConnector"
port="8080" minProcessors="5" maxProcessors="75"
enableLookups="true" redirectPort="8443"
acceptCount="100" debug="0" connectionTimeout="20000"
useURIValidationHack="false" disableUploadTimeout="true" />
-->

위의 내용이 있는 곳에서 조금 아래쪽을 보면 다음과 같은 부분이 있다. org.apache.coyote.tomcat4.CoyoteConnector라는 이름의 Connector가 mod_jk2로 연결할 때 사용하는 부분으로, 아래쪽의 org.apache.ajp.tomcat4.Ajp13Connector가 mod_jk를 사용할 때 쓰는 부분이므로 mod_jk 부분(아래쪽)을 주석 처리하도록 한다.
<!-- Define a Coyote/JK2 AJP 1.3 Connector on port 8009 -->
<Connector className="org.apache.coyote.tomcat4.CoyoteConnector"
port="8009" minProcessors="5" maxProcessors="150"
enableLookups="true" redirectPort="8443"
acceptCount="10" debug="0" connectionTimeout="20000"
useURIValidationHack="false"
protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler"/>

<!-- Define an AJP 1.3 Connector on port 8009 -->
<!--
<Connector className="org.apache.ajp.tomcat4.Ajp13Connector"
port="8009" minProcessors="5" maxProcessors="75"
acceptCount="10" debug="0"/>
-->

서버 구동 확인

톰캣과 아파치를 실행시킨 후 다음의 주소를 입력해 본다.
http://localhost/examples/servlets/index.html
http://localhost/examples/jsp/index.html
제대로 servlet 또는 jsp의 예제 페이지가 나타나고 각 예제들이 올바로 실행된다면 설치가 올바로 이루어진 것이다. 만약 jsp 나 서블릿 파일이 다운로드 된다거나 소스코드가 보인다거나 404 에러 등이 발견되면 어디에선가 셋팅이 잘못된 것이다. 클래스패스의 문제, servlet.jar 패키지의 부재, 잘못된 JDK컴파일러 설치, 설정파일 편집 오류 등 다양한 문제가 있을 수 있다. 아파치의 톰캣의 로그파일과 설치메뉴얼을 보면서 약간의 노력을 더 기울인다면 무난하게 해결 할 수 있을 것이다.

java Framework/Linux 에서 APM(apache2.0.48)+tomcat(5.0.16) 연동하기(mod_jk2)



[펌] Linux 에서 APM(apache2.0.48)+tomcat(5.0.16) 연동하기(mod_jk2) | Unix/Linux2005/03/23 01:10
 
http://blog.naver.com/mickey109/60011163411
출처블로그 : mWorld - ccm 짜집기 java/apache/linux/php/mysql/

Linux 에서 APM(apache2.0.48)+tomcat(5.0.16) 연동하기(mod_jk2)

TOC ( Table of Content )
0.overview
1.mysql 설치
2.apache (2.0.48) 설치
3.php 설치
4.APM 연동
5.zend optimizer 설치
6.jdk의 설치
7.tomcat (5.0.16)설치
8.jk2( jakarta-tomcat connector ) 설치
9.apache 와 tomcat의 연동
10.사용자 계정에서 jsp 사용 가능하도록 context listener 추가하기
epilog
0.OverView
-- 이 글의 목적은 apache2.x.x 버전과 tocmat5.x.x 버전의 연동을 주
목적으로 하여 작성된 글이다. 따라서 APM 연동보다는 아파치 톰캣 연동에
그 비중을 두고 있으며, 이 글을 읽는 사람들은 어느정도 linux에 대한 지
식(프로그램 설치시 rpm 설치가 아닌 소스 컴파일 설치) 을 갖추었다고
가정하고 글을 진행하도록 한다.
(주1. 본 문서는 각종 사이트를 돌아다니며 읽은 글들의 조합으로 이루어져
있습니다.. 최대한 출처를 밝히겠지만 미처 밝히지 못하는 부분에 대해 원저자분
들께 대해 죄송스럽게 생각합니다.)
(주2. 존칭은 생략하도록 하겠습니다. (--) (__) )
(주3. 소스를 컴파일 하여 프로그램을 설치 하는 것이나 apache와 tomcat의 연동은
버전과 시스템에 따라 다를 수 있습니다. 따라서 이 문서를 보고 따라 하신 후의 책임은
지지 않습니다.)
APM 연동은 다음 site를 참조한다
 http://ho.dunggi.net/study_linux ( apache1.xx apache2.xx 버전에 대한 연동이 모두 나옵니다.)
1.mysql 설치
-- http://www.mysql.com 사이트에서 mysql을 다운 받는다. 안정된 버전일 경우 최신 버전을 다운 받는다.
-- 받은소스를 /usr/local/src 로 이동한다.(소스의 위치는 각자 편한곳으로 한다.)
-- 기존에  rpm으로 mysql이 설치 되 있었다면 삭제한다.

 ( rpm -qa | grpe mysql 하면 rpm으로 설치된 mysql을 확인 할 수 있고, rpm -e --nodeps mysql.xxx 하면
 삭제가 가능하다.)
-- tar xvzf mysql.xxx.tar.gz 명령으로 소스를 푼다. (xxx 는 버전을 뜻합니다.)
-- mysql.xx.xx 라는 디렉토리가 생성된다.
-- 생성된 디렉토리로 이동하여
 ./configure --prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data --with-charset=euc_kr
 라는 명령으로 mysql소스를 configuration 한다.
 (--prefix는 mysql이 생성될 디렉토리, localstatedir은 mysql의 data가 위치할 경로, charset은 한글 사용을
 위한 옵션이다. 자세한 사항은 ./configure --help 명령을 통해 확인한다.
 에러가 없다면

 make

 make install

 명령을 통해 mysql을 설치완료 한다.
 여기 까지 에러가 없다면 /usr/local/mysql 이란 디렉토리가 생성되고 그 안에 mysql 실행을 위한 명령어
 들과 library가 생겨난다. ( mysql 설치 완료  하지만 끝이 아니다!!)
-- /usr/local/mysql/bin 으로 이동한다.
 ./mysql_install_db
 라는 명령어를 실행시켜준다.(주의! 이 명령어는 한번만 실행시킨다. 여러번 실행시킬 경우 에러가 발생할 수 있다.)
-- /usr/local/mysql/share/mysql 로 이동하면 mysql.server 라는 쉘 스크립트를 볼 수 있다.
 ./mysql.server start

 라는 명렁을 통해 mysql을 실행시킨다. /usr/local/mysql/bin 으로 이동하여 mysql 명령어를 치면 mysql에
 접속할 수 있다. 어느곳에서든지 mysql 명령어를 수행시키길 원한다면 /etc/profile 의 PATH에 추가해 주면 된다.
-- 시스템 부팅과 동시에 mysql을 수행시키고자 할 경우 /etc/rc.d/init.d 디렉토리로 이동하여
 ln -s /usr/local/mysql/share/mysql/mysql.server myslqd
 라는 명령어를 통해 링크를 걸고 자신의 run level을 확인하여 해당 run level 디렉토리로 이동하여
 (run level이 3이라면 /etc/rc.d/rc3.d  , run level이 5라면 /etc/rc.d/rc5.d )
 ln -s /etc/rc.d/init.d/mysqld S80mysqld
 라는 링크를 걸어주면 시스템의 시작과 동시에 mysql서버를 구동시킬 수 있다.
 ( 해당 디렉토리로 이동하면 SxxXXX 와 KxxXXX 라는 많은 파일들이 있을 것이다. S는 시스템이 시작할 때
 수행될 명령들이고 K는 시스템이 종료될 때 수행될 명령들이다. 따라서 SxxXXX라는 명령으로 링크를 건다
 S뒤의 숫자는 기존에 있던 것들과 겹치지 않는 수로 S99local 보단 작게 한다
 자신의 run level 확인은 /etc/inittab 파일을 열어 보면 id:x:initdefault: 라는 문장을 찾을 수 있다.
 여기서 x에 해당하는 숫자가 해당 시스템의 default run level이다. 보통 3 또는 5로 지정되는데
 3이 일반적인 콘솔로 부팅시에 사용되고, 5는 X-window로 부팅될때 사용된다. 그 외의 run-level에 관한 사항은
 각자 공부하길 바란다. -- 솔직히 필자도 잘 모른다. --;;;)
-- 이로써 mysql 설치는 완료된다.

2.apache2의 설치
-- 기존에 rpm package로 설치된 아파치를 삭제한다.(mysql의 삭제와 동일)
-- http://httpd.apache.org/download.cig  httpd-2.0.48.tar.gz 을 다운받는다.
-- 소스를 /usr/local/src 로 이동한후 tar 명령을 통해압축을 푼다.
-- 소스 디렉토리로 이동한 후

 ./configure --prefix=/usr/local/apache2 --enable-rule=SHARED_CORE --enable-shared=max --enable-so --enable-module=so
 명령을 통해 configuration. (./cofigure --help를 통해 각 옵션을 확인하는 것도 좋습니다. ^^)
 make
 make install 하여 아파치를 설치한다.
-- /usr/local/apache2/bin 디렉토리로 이동하여
 ./apachectl start
 명령을 통해 아파치를 실행시킨다. 브라우저로 해당 URL에 접속하여 에러가 없다면 아파치 설치 성공!
3.php의 설치
-- 기존의 rpm package 제거
-- http://www.php.net/downloads.php 에서 php4.3.4.tar.gz을 다운 받는다.
-- /usr/local/src로 소스 이동 후 tar로 압축을 푼다.
-- 소스 디렉토리로 이동하며
 ./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2/bin/apxs --with-apache-install=/usr/local/src/httpd-2.0.48 --with-mysql=/usr/local/mysql --with-config-file-path=/usr/local/apache2/conf --with-zlib-dir=/usr/lib --with-zlib --enable-track-vars=yes --enable-modules=so --disable-debug --enable-mbstring
 명령을 통해 configuration. --with-apache-install 옵션뒤의 디렉토리는 아파치 소스 디렉토리(각자 자신이 압축을
 해제한 디렉토리로 명시한다.(이 문서를 따라 했다면 /usr/local/src/httpd-2.0.48) --with-mysql옵션뒤의 경로는 mysql

 이 설치된 디렉토리(/usr/local/mysql)를 기술한다. 옵션이 많아서 그런지 시간이 조금 걸린다.)
 에러가 없다면
 make
 make install
-- php의 소스 디렉토리로 이동하여(/usr/local/src/php4.3.4)
 cp php.ini-dist /usr/local/apache2/conf/php.ini
 명령을 수행한다.
-- php의 설치가 완료
4. apache와 php의 연동
-- /usr/local/apache2/modules 디렉토리로 이동해 보면 libphp4.so 란 파일이 있을 것이다. 없다면 위의 과정을 천천히
 다시 수행한다 --;;
-- /usr/local/apache2/conf 에 httpd.conf 파일을 열어보면 220라인 근처에
 LoadModule  php4_module     modules/libphp4.so
 라는 문장이 있을 것이다.
 DirectoryIndex 를 찾아 index.php를 추가 시킨다.
 (ex. DirectoryIndex index.html index.php index.htm )
 그리고 880라인 근처에 보면 AddType 이란 것이 있을 것이다. 그곳에
 AddType application/x-httpd-php .php
 AddType application/x-httpd-php-source .phps
 라는 두 문장을 추가 시켜준다.
-- /usr/local/apache2/bin 으로 이동한 후
 ./apachectl start ( 이미 구동중이라면 ./apachectl restart)
 한 후
 test.php 라는 파일을 아래와 같이  작성하고
 <?
  phpinfo();
 ?>
 브라우저로 읽어서 php 설정 정보에 대한 테이블이 나오면 APM 연동은 성공!!
 만일 소스코드가 그대로 보이거나 다운로드가 되면 연동에 실패한 것이다.
# 이하의 부분은 http://kltp.kldp.org/stories.php?topic=14 의 예크디엠님 글을 참조한다.
5.Zend optimizer의 설치  (옵션. 필수사항은 아니다. Zend는 php 가속기이다.)
-- http://zend.com/store/free_download.php?pid=13 에서 리눅스용 소스파일을 다운로드 받는다.
-- /usr/local/src/로 이동후 tar로 압축 해제
-- 소스 디렉토리로 이동하여
 ./install.sh
 를 수행하면 GUI 인터페이스의 설치 환경이 나타난다. apache의 설치 경로등을 묻는데 정확히
 기입하도록 한다. 설치는 /usr/local/Zend 디렉토리로 자동으로 이루어 진다.
 설치가 이루어 지면 /usr/local/apache2/conf/php.ini 파일은 php.ini-zend_optimizer.bak 으로 변경되고

 php.ini 파일이 /usr/local/Zend/etc 안에 생성되며 /usr/local/apache2/conf 디렉토리 안에는

 /usr/local/Zend/etc/php.ini 의 symbolic link 파일이 만들어져 실제 php.ini 파일과 연결됩니다.
-- Zend optimizer 설치 완료
6.jdk의 설치
-- http://java.sun.com/webapps/download/DisplayLinks 에서 j2sdk-1_4_2-nb-3_5_1-bin-linux 를 다운 받는다.
 (확장자가 tar.gz 이 아니라고 당황하지 말자. 필자는 솔직히 당황했었다 --;;)
-- 소스를 /usr/local로 이동시킨다.
 sh j2sdk-1_4_2-nb-3_5_1-bin-linux.bin
 명령어를 수행한다.
 ( chmod 755  j2sdk-1_4_2-nb-3_5_1-bin-linux.bin 명령후  ./j2sdk-1_4_2-nb-3_5_1-bin-linux.bin 도 가능할 것 같다.)
-- /usr/local/j2sdk-1_4_2 라는 디렉토리가 생겼을 것이다. (확실치는 않다. --;; 비슷한게 생겼을 것이다.)
-- 편의를 위해 /usr/local 디렉토리에서
 ln -s /usr/local/j2sdk-1_4_2  java
 라는 링크를 걸어준다
-- /etc/profile의 PATH에 /usr/local/java/bin 을 추가해 놓으면 어디서든지 java명령이 수행가능!
--jdk 설치 완료
7.tomcat의 설치
-- java가(jdk) 미리 설치 되어 있어야 한다.
-- http://jakarta.apache.org/site/binindex.cgi 에서
 jakarta-tomcat-5.0.16.tar.gz을 다운 받는다.
-- 해당 소스를 /usr/local 로 이동한 후 tar로 압축을 해제한다.
-- 톰캣은 컴파일없이 압축만 해제하면 바로 실행가능 상태가 된다.
-- 편의를 위해  /usr/local 디렉토리에서
 ln -s /usr/local/jakarta-tomcat-5.0.16 tomcat
 명령을 통해 링크를 걸어 놓는다.
-- /usr/local/tomcat/bin 으로 이동하여
 ./catalina start
 명령을 수행한다.
 JAVA_HOME=/usr/local/java
 CATALINA_HOME=...
 ...
 ..
 이렇게 4줄이 뜨면 성공이다. 혹시 에러가 나면서
 JAVA_HOME이 정의 되지 않았다는 메시지가 출력될 경우
 /etc/profile 을 열고
 JAVA_HOME=/usr/local/java
 라는 문장을 추가 시키고 저장한 뒤
 source profile
 이라는 명령을 수행한 후 tomcat을 가동시킨다.
 에러 없이 톰캣이 뜨면
 http://xxx.xxx.xxx.xxx:8080 으로 접속하여
 고양이 그림을 볼 수 있다면 톰캣 설치에 성공한 것이다.
-- tomcat 설치 완료
8.jk2 설치
-- http://jakarta.apache.org/site/sourceindex.cgi 에서 jakarta-tomcat-connectors-jk2-src-current.tar.gz 다운
-- /usr/local에서 tar 명령을 통해 압축을 해제한다.
-- /usr/local/jakarta-tomcat-connectors-jk2-src-current/jk/native2 로 이동한다.(정확치는 않다. 아무튼 native2 디렉
 토리로 이동한다. -- 제가 작업한 머신에서 글을 작성하는게 아님을 이해해 주십시요)
-- 해당 디렉토리에서
 ./configure --with-apxs2=/usr/local/apache2/bin/apxs
 를 수행한다.(주. apxs는 perl 스크립트 입니다 perl 5.0 이상이 해당 머신에 설치되어 있어야 합니다.)
 make
 를 하면  /usr/local/jakarta-tomcat-connectors-jk2-src-current/jk/build/jk2 /apache2 디렉토리에
 mod_jk2.so 파일이 생성된다. 만일 없다면 .... 이땐 정말 에러다 --;;
 만일 mod_jk2.so 파일이 존재하지 않는다면 jk2 설치부터 make 까지의 과정을 다시 해본다.
 ( 이 부분에서 막혀서 3일간 고생했습니다. mod_jk2.so 파일이 생성이 안되서... 결국 make를 통해 mod_jk2.so 생성은
 포기를 하고 꽁수를 썼습니다. 이 부분이 하이라이트!!)
 만일 재시도 했는데도 생기지 않는다면 ...
 (저의 경우 libtool --mode=install ... 하면서 warning이 뜨더군요. 예크디엠님의 글을 보고 추측하건데
 jk2가 컴파일 되면서 libtool을 찾는 과정에서 문제가 생기는 듯합니다.)
 해당 디렉토리에 mod_jk2.xx 라는 많은 파일들이 존재할 것이다. 여기서
 gcc -shared -o mod_jk2.so *.o
 라는 명령을 통해 강제 컴파일 하여 공용 모듈을 생성해낸다.!!!!
 cp mod_jk2.so /usr/local/apache2/modules
 명령을 통해 아파치 모듈 디렉토리로 복사한다.
9. apache와 tomcat의 연동
-- /usr/local/apache2/conf/httpd.cnof 파일을 열어
 DirectoryIndex를 찾아 index.jsp를 추가한다.
 ( ex) DirectoryIndex index.html index.php index.jsp )
 LoadModule  jk2_module  modules/mod_jk2.so
 를 추가한 후 저장하고 /usr/local/apache2/bin 디렉토리로 이동하여
 ./apachectl configtest
 를 수행하여 Syntax Ok 가 뜨면 OK!!
-- /usr/local/src/jakarta-tomcat-connectors-jk2-2.0.2-src/jk/conf/workers2.properties 파일을 /usr/local/apache2/conf/workers2.properties.bak
 
 으로 복사한다.
-- 편집기로 worker2.properties 파일을 만들고 다음과 같이 편집한다.
 # Shared memory handling. Needs to be set.
 [shm]
 file=/var/log/httpd/shm.file
 size=1048576
 # Example socket channel, explicitly set port and host.
 [channel.socket:localhost:8009]
 port=8009
 host=127.0.0.1
 # define the worker
 [ajp13:localhost:8009]
 channel=channel.socket:localhost:8009
 # Announce a "status" worker
 [status:status]
 # Uri mapping
 [uri:/jsp-examples/*]
 worker=ajp13:localhost:8009
 [uri:/servlets-examples/*]
 worker=ajp13:localhost:8009
 [uri:/tomcat-docs/*]
 worker=ajp13:localhost:8009
 [uri:/*]
 worker=ajp13:localhost:8009
 [uri:/status/*]
 worker=status:status
 ( worker2.properties.bak 파일은 나중에 공부하기 위해 복사해
 놓은 것입니다. 위의 내용만 있어도 연동에는 충분합니다.)
 위의 내용을 대~~충 분석(??)해 보면 (솔직히 잘 모른다. --;;)
 shm 부분은 공유 메모리를 위한 설정이고, channel은 연동시 사용할 port와 host를 설정한다.
 당연히 80포트로 들어온 놈들은 다른 곳이 아닌 자기자신(127.0.0.1 -- loopback)에게 8009번
 포트를 이용하여 tomcat에게 넘긴다는 얘기 같다. (확신은 없다. --;;)
 uri 부분은 context mapping 관련이다. 가장 주목할 것은 [uri:/*] 해당 URL로 들어오는 모든(*)
 것들을 8009번 포트로 tomcat에게 넘긴다. 이는 나중에 보충 설명한다.
 마찬가지로 나머지 uri 부분은 해당 URL로 /jsp-examples 라는 context(??)들 달고 오는 모든(*) 것들을
 tomcat에게 넘긴다는 것이다.
 status는 jk-connector의 설정 보여준다.
 연동뒤에 http://xxx.xxx.xxx.xxx/status 하면 설정상황을  볼 수 있다.
-- /usr/local/tomcat/conf/jk2.properties 파일을 다음과 같이 수정.
 ## THIS FILE MAY BE OVERRIDEN AT RUNTIME. MAKE SURE TOMCAT IS STOPED
 ## WHEN YOU EDIT THE FILE.
 ## COMMENTS WILL BE _LOST_
 ## DOCUMENTATION OF THE FORMAT IN JkMain javadoc.
 # Set the desired handler list
 # handler.list=apr,request,channelJni
 #
 # Override the default port for the socketChannel
 channelSocket.port=8009
 # Default:
 # channelUnix.file=${jkHome}/work/jk2.socket
 # Just to check if the the config is working
 # shm.file=${jkHome}/work/jk2.shm
 shm.file=/var/log/httpd/jk2.shm
 # In order to enable jni use any channelJni directive
 # channelJni.disabled = 0
 # And one of the following directives:
 # apr.jniModeSo=/opt/apache2/modules/mod_jk2.so
 # If set to inprocess the mod_jk2 will Register natives itself
 # This will enable the starting of the Tomcat from mod_jk2
 apr.jniModeSo=inprocess

-- 이로써 모든 설정은 완료 됩니다.
-- 톰캣과 아파치가 구동중이라면 각각 해당 디렉토리의 /bin 으로 이동
 하여
 ./catalina.sh stop
 ./apachectl stop
 명령을 통해 중지 시킨다.
-- 이제 연동이 됐는지 확인.
 톰캣을 먼저 띄우고 다음에 아파치를 띄운다.
 ./catalina.sh start
 ./apachectl start
-- 브라우저로 해당 URL에 접속하여

 http://xxx.xxx.xxx.xxx/
 에 접속한다. 톰캣 메인 화면이 뜨면 OK!
 http://xxx.xxx.xxx.xxx/jsp-examples
 에 접속하여 각각의 jsp 예제파일들이 문제 없이 수행되면 OK!

-- 접속을 하면 아파치의 DocumentRoot가 아닌 tomcat main page 가 뜨는것에 의아해 하는 분들도 계실지
 모른다.(사실은 내가 그랬다 --;;) 그 이유인 즉은..
 worker2.properties 파일에서 [uri] 설정에
 [uri:/*]
 worker=ajp13:localhost:8009
 이 부분 때문이다. 즉 해당 URL로 들어오는 모든(*) 것들에 대해 톰캣에게 넘겨 주는 것이다.
 아파치의 직무 유기다. --;;
 jsp 파일만을 tomcat에게 넘기기위해서는
 저 부분을
 [uri:/*.jsp]
 worker=ajp13:localhost:8009

 라고 수정하면 된다. 하지만 필자가 저렇게 했을 때 숱한 403 에러를 만났다. --;;
  저렇게 설정을 하고 나서 브라우저로 보면 아파치의 DocumentRoot로 창이 열린다.
 문제는 DocumentRoot 밑에 test.jsp를 수행하면 tomcat으로 가지 못한다는 것이다.
 신기하게도 http://xxx.xxx.xxx.xxx/jsp-examples 하면 이것은 또 잘 열린다. --;;
 아무튼.. 저걸 해결하고자 기껏 필자가 생각해 낸것은
 아파치의 DocumentRoot와 tomcat의 ROOT를 같은 곳으로 설정 하는 방법이다.
 /usr/local/tomat/conf/server.xml 을 열어보면
 <!-- Tomcat Root Context -->
 <Context path="" docBase="ROOT" debug="0"/>
 라는 부분이 있다.
 이부분을 다음과 같이 수정한다.
 <Context path="" docBase="/usr/local/apache2/htdocs" debug="0" reloadable="true"/>
 물론 "/usr/local/apache2/htdocs" 는 각자 자신의 시스템의 DocumentRoot로 설정 하면 될 것이다.
 이렇게 설정을 하고 톰캣을 다시 띄우고, 아파치를 다시 띄우니..

 드디어 아파치의 DocumentRoot 밑에 있는 jsp 파일을 인식했다!!
 즉 , http://xxx.xxx.xxx.xxx/test.jsp 가 열리는 것이다.
 물론 깔끔한 방법은 아니다.!! tomcat의 context 추가에 대한 지식이 부족하여 저렇게 한 것이다.
 http://www.apache-korea.org/tomcat/tomcat-5.0-doc/config/context.html (영문)
 http://jakarta.apache-korea.org/tomcat/tomcat-4.1-doc/config/context.html (한글)
 ( 관심 있는 분들은 위 사이트에 접속하여 context에 관한 부분을 더 공부 하시길 바랍니다.)
 이로써 아파치와 톰캣의 연동은 성공!! 한 것이다.
10. 사용자 계정에서 jsp 사용하기
 http://jakarta.apache-korea.org/tomcat/tomcat-4.1-doc/config/host.html#User%20Web%20Applications
 위 사이트를 참조 하세요
-- 위처럼 연동이 됐다고 해서
 http://xxx.xxx.xxx.xxx/~xxx/test.jsp
 라고 했을 때 jsp 파일을 톰캣이 처리해 주지는 못한다.
 tomcat의 server.xml 파일에 Listener를 등록해 주어야 한다.
 /usr/local/tomcat/conf/server.xml 파일을 열고
 <Host name="localhost" ...> 이 부분을 찾아 아래에 다음과 같이 추가한다.
 <Listener className="org.apache.catalina.startup.UserConfig" directoryName="public_html"

 userClass="org.apache.catalina.startup.PasswdUserDatabase"/>
 이것은 linux 시스템의 경우 /etc/passwd 파일을 사용한다고 한다. 정확히 어떻게 동작하는 것은
 필자도 이해하지못했다. 다만 이렇게 설정을 한후 ,톰캣과 아파치를재시동하고
 http://xxx.xxx.xxx.xxx/~xxx/test.jsp
 를 열어보면 드디어 감격적인 jsp page를 볼 수 있다.!!

ps.  tip아닌 tip을 말씀드리면 ..모두 아실거라 생각됩니다만... 소스 다운 받으실 때
일일이 ftp로 넘기지 마시고 리눅스 console 상에서 wget을 통해 받으면 쉽습니다.
링크가 걸린 다운로드 파일에서 마우스 오른쪽 버튼 클릭하셔서 등록정보 를 클릭하시면
주소가 나옵니다 이걸복사해서
 wget http://http://mirror.apache.or.kr/httpd/httpd-2.0.48.tar.Z
 이런식으로 직접 콘솔에서 다운받으실 수 있습니다.

아파치와 톰캣의 연동후 실행 순서는 톰캣 먼저 띄운후에 아파치를 띄우게 됩니다. 이걸 리눅스
시스템 부팅과 동시에 하려면 mysql 을 하셨던것 처럼  /etc/rc.d/init.d로 이동하신 후
 아파치)
 cd /etc/rc.d/init.d
 ln -s /usr/local/apache2/bin/apachectl httpd
 run level 디렉토리로 이동 후 (/etc/rc.d/rc3.d --run level 3인 경우)

 ln -s /etc/rc.d/init.d/httpd S75httpd

 톰캣)
 cd /etc/rc.d/init.d
 ln -s /usr/local/tomcat/bin/catalina.sh tomcatd
 cd /etc/rc.d/rc3.d (run level 디렉토리)
 ln -s /etc/rc.d/init.d/tomcatd S72tomcatd
 이렇게 설정해 주시면 됩니다. 단! 톰캣의 숫자가 아파치의 숫자보다 작아야 겠지요. 그래야 부팅시
 톰캣이 먼저 구동됩니다. 다른 것들과 겹치지 않는 수중 자유롭게 쓰시면 됩니다.
 한가지 주의 하실 점은 리붓을 했는데 아파치는 뜨고 톰캣은 뜨지 않는 경우가 있습니다.
 이럴땐 /var/log/message 파일을 열어 에러 메시지를 확인하시기 바랍니다.
 저의 경우 JAVA_HOME을 못 찾아서 계속 뜨지 못하더군요 그래서
 /etc/rc.d/init.d 디렉토리의 tomcatd 파일을 열어
 JAVA_HOME=/usr/local/java
 라고 추가해 줬더니 다음번 부팅시엔 둘다 연동된 상태로 구동 되었습니다.
 지금 상황으론 아파치 DocumentRoot나 각 사용자 계정에서 jsp 파일들은 모두 인식되는데 servlet은
 아직 안되더군요. 혹시 servlet도 성공하신분은 리플 주시면 감사 ^^
Epilog
-- 처음으로 문서를 작성해 봅니다. 저도 아파치와 톰캣을 연동하느라 삼일을 버렸기에, 다른분들은
고생을 덜 하기실 바라며 문서를 남깁니다.(이대로 따라하셨다가 고생을 더하셔도 책임은 못집니다. ㅠ.ㅠ)
삼일동안 각종 버전의 아파치와 톰캣을 깔았다 지웠다를 반복하며, 이사이트 저사이트 정신없이 창 여러개 띄워서
이문서 저문서 보던게 효율이 너무 안 좋아서 하나로 합쳐 보았습니다. 부디 이 문서를 보시고 다들 한번에
연동에 성공하시길 바랍니다.
글의 내용중 잘못 된 부분이 있을 수도 있습니다. 이점 양해 바랍니다.
    2004년 1월 18일   이 지 형

java Framework/jsp 프로그래밍] 패키지로 컴파일된 java 혹은 jar 파일 실행하기


- 패키지 컴파일 및 실행
-- 컴파일
package sample; 로선언된 소스인경우,

javac -d xxx.java

-- 실행
$ java sample.Test

(java 패키지이름.메인클래스)

java -classpath .;$JAVA_HOME/lib/tools.jar;D:/~/WEB-INF/classes; test.Tester


- jar  파일 실행 방법
$ java –jar test.jar

만약 인자값이 있으면
$ java –jar test.jar 인자값리스트

java Framework/jsp 프로그래밍/common.net을 이용한 FTP client 프로그램



소스영역 :::

/**
 * 참조 사이트 목록
 * http://www.okjsp.pe.kr/seq/51685
 * http://benelog.springnote.com/pages/1468338
 * 참조해서 작업 해 본것임.
 * apache 의  common.net api 사용
 * ftp batch 작업을 위한  용도
 * 2009.03.26
 * 인자 : -H:server ip, -P:server port, -UI:user id, -UP:user pw, -PM:passive-mode
 */
package net.nchannel.ftp;
/**
 * @author snipper
 *
 */
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.*;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
//import org.apache.commons.net.ftp.FTPListParseEngine;
//import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.Logger;

public class FCBatch {
//    protected static final Log logger = LogFactory.getLog(FCBatch.class);
 /**
  *
  */
    public FCBatch() {
  // TODO Auto-generated constructor stub
 }
 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  // 인자는 -H, -P, -ui, -up, -path, -pm 이 존재
  String host = "";
  String port = "";
  String id = "";
  String pw = "";
  String rpath = "";
  String pm = "";
  String fileNm = "";   //"JeusServer_"+getDate(-1)+".log"; //현재 이전 날짜의 파일 가져오기 위한 파일명 구하기
  String lpath = "";    //"d:\\jeuslogs\\JeusServer_"+getDate(-1)+".log"; //현재 이전 날짜의 파일 가져오기 위한 파일명 구하기
  FileOutputStream fos = null;
 
//  System.out.println("입력 인자 수 : " + args.length);
//  System.out.println("파일 명  : " + fileNm);
  // 입력된 인자 값을 각 의미 변수에 할당.
  for(int i=0; i < args.length; i++) {
   if(args[i].indexOf("-H")!=-1)
    host = args[i].substring(2);
   if(args[i].indexOf("-P")!=-1)
    port = args[i].substring(2);
   if(args[i].indexOf("-UI")!=-1)
    id = args[i].substring(3);
   if(args[i].indexOf("-UP")!=-1)
    pw = args[i].substring(3);
   if(args[i].indexOf("-RP")!=-1)
    rpath = args[i].substring(3);
   if(args[i].indexOf("-LP")!=-1)
    lpath = args[i].substring(3);
   if(args[i].indexOf("-FN")!=-1)
    fileNm = args[i].substring(3);
   if(args[i].indexOf("-PM")!=-1)
    pm = args[i].substring(3);
  }
  if(port.equals("")) port = "21";  //접속 포트 번호, 기본 21번 포트 사용
  if(rpath.equals("")) rpath = "/home/tmax/jeus5/logs/ECOWEB/";  //원격 기본 디렉토리 설정, 제우스를 기본으로 했음.
  if(lpath.equals("")) lpath = "c:\\jeuslogs\\";      //로컬 기본 디렉토리 설정, 로컬 디렉토리가 없을 경우.... 현재 폴더로 해도 되나 그냥 위와 같이 함.
  if(fileNm.equals("")) fileNm = "JeusServer_"+getDate(-1)+".log"; //가져올 기본 파일명 설정
  if(pm.equals("")) pm = "Y"; // 패시브모드 on(기본모드)
//  System.out.println("host = " + host);
//  System.out.println("port = " + port);
//  System.out.println("id = " + id);
//  System.out.println("pw = " + pw);
//  System.out.println("remote path = " + rpath);
//  System.out.println("local path = " + lpath);
//  System.out.println("file name = " + fileNm);
//  System.out.println("passive mode y/n  = " + pm);
 
  FTPClient ftp = null;
 
  try {
   ftp = new FTPClient();
   ftp.setControlEncoding("euc-kr");  // ftp 인코딩을 EUC-KR 로 설정.
  
//   if(logger.isDebugEnabled()) {
    System.out.println("FTP Client Test Progrma with Commons NET");
    System.out.println("test by 2009.03.26");
    System.out.println("FCBatch main() start");
//    System.out.println("host = " + host);
//    System.out.println("port = " + port);
//    System.out.println("id = " + id);
//    System.out.println("pw = " + pw);
//    System.out.println("remote path = " + rpath);
//    System.out.println("passive mode y/n  = " + pm);
//   }
//  
  
   if(!host.equals("") && !port.equals("") && !id.equals("") && !pw.equals("")) {
    // ftp 연결
    ftp.connect(host,Integer.parseInt(port));
//    if(logger.isDebugEnabled()) {
     System.out.println("connected to " + host +":"+port);
//    }
//    if(logger.isDebugEnabled()) {
     System.out.println("login by user id : " + id +", password :"+pw);
     System.out.println("ftp.login()");
//    }
    ftp.login(id, pw);
//    if(logger.isDebugEnabled()) {
     System.out.println("login success...");
//    }
   
    // 패시브 모드 설정 하기
    if(pm.endsWith("Y")) {
//     if(logger.isDebugEnabled()){
      System.out.println("passive mode 설정");
      System.out.println("passive mode 입력 값: " +pm);
//     }
     ftp.enterLocalPassiveMode();
//     if(logger.isDebugEnabled()){
      System.out.println("passive mode 설정 완료");
//     }
    }
   
    //change directory
//    if(logger.isDebugEnabled()) {
     System.out.println("change directory : " + rpath );
     System.out.println("ftp.changeWorkingDirectory("+rpath+")");
//    }
    ftp.changeWorkingDirectory(rpath);
//    if(logger.isDebugEnabled()) {
     System.out.println("경로 변경 : " + rpath);
//    }
   
//    if(logger.isDebugEnabled()) {
     System.out.println("파일 전송 타입 설정  : setFileType" );
     System.out.println("ftp.setFileType(FTP.BINARY_FILE_TYPE)");
//    }
    ftp.setFileType(FTP.BINARY_FILE_TYPE);
//    if(logger.isDebugEnabled()) {
     System.out.println("파일 전송 타입 설정 완료 " );
//    }
   
    // ftp  사이트 리스팅.
//    ftpList(ftp, path);
/*    
    try{
//     if(logger.isDebugEnabled()) {
      System.out.println("서버 디렉토리 리스팅  : " );
      System.out.println("ftp.setFileType(FTP.BINARY_FILE_TYPE)");
//     }
     FTPListParseEngine engine = ftp.initiateListParsing("unix",path);
     System.out.println("" + StringUtils.rightPad("Name", 30) + StringUtils.leftPad("Size", 10) + " ");
     System.out.println("" + StringUtils.leftPad("-", 30, "-") + StringUtils.leftPad("-", 10,"-") + "-");
    
     int idx=0;
    
     while(engine.hasNext()) {
      FTPFile[] files = engine.getNext(25);
      idx += files.length;
     
      for(int i=0; i < files.length; i++) {
       FTPFile file= files[i];
       System.out.println(StringUtils.rightPad(" "+file.getName(),30) + StringUtils.leftPad(""+file.getSize(), 10) + " ");
      
      }
     }
    
     System.out.println("-" + StringUtils.leftPad("-", 30, "-") + StringUtils.leftPad("-", 10, "-") + "-");
     System.out.println(" total : " + idx);
     System.out.println("  ");
      
//     if(logger.isDebugEnabled()) {
      System.out.println("서버 디렉토리 리스팅  : " + path + "완료" );
//     }
    } catch (Exception e) {
     System.out.println("ftp 리스팅 실패");
     e.printStackTrace();
     System.exit(-1);
    }
   
*/   
    // 파일 내려 받기 ??
    try {
     fos = new FileOutputStream(lpath+fileNm);
     ftp.retrieveFile(fileNm, fos);
    } catch(IOException e) {
     System.out.println("IO Exception : " + e.getMessage());
    } finally {
     if(fos != null) {
      try {
       fos.close();
      
      } catch (IOException e) {
       System.out.println("IO Exception : " + e.getMessage());
      }
     }
    }
   
    System.out.println(fileNm + "파일 다운로드 완료 !!!");  
   
   } else { // host, port, id, pw 없으면 에러 발생.
    System.out.println("usage : FCBatch -Hhost -P[port] -UIid -UPpw -RP[remote path] -LP[local path] -FN[file name] -PM[passive mode] ");
    System.out.println("options ");
    System.out.println("-H : Host [Name | IP] ");
    System.out.println("-P : 접속할 포트 번호 ,     Default : 21 ");
    System.out.println("-UI : User ID ");
    System.out.println("-UP : User Password");
    System.out.println("-RP : FTP Server Path,    Default : /home/tmax/jeus5/logs/ECOWEB/");
    System.out.println("-LP : Localhost Path,    Default : c:\\jeuslogs\\");
    System.out.println("-FN : Download 할 File Name ,  Default : JeusServer_"+getDate(-1)+".log  ");
    System.out.println("-PM : Passive Mode 사용 여부 [Y/N], Default: Y ");
   
//    throw new Exception("접속에 필요한 필수 정보를 입력하지 않으셨습니다.");
   }
  
  
  } catch (Exception e) {
//   System.out.println("ftp 로그인 실패");
   e.printStackTrace();
  } finally {
   // ftp 연결 해제.
//   System.out.println("ftp 연결해제");
   if(ftp != null && ftp.isConnected()) {
    try {
     ftp.disconnect();
    } catch (IOException e) {
     System.out.println("IOException : " + e.getMessage());
    }
   }
   // 프로그램 종료
   System.exit(-1); // 종료
  }

 }
/*
 public static void ftpList(FTPClient ftp, String path) {
  try{
   if(logger.isDebugEnabled()) {
    System.out.println("서버 디렉토리 리스팅  : " );
    System.out.println("ftp.setFileType(FTP.BINARY_FILE_TYPE)");
   }
   FTPListParseEngine engine = ftp.initiateListParsing("unix",path);
   System.out.println("" + StringUtils.rightPad("Name", 30) + StringUtils.leftPad("Size", 10) + " ");
   System.out.println("" + StringUtils.leftPad("-", 30, "-") + StringUtils.leftPad("-", 10,"-") + "-");
  
   int idx=0;
  
   while(engine.hasNext()) {
    FTPFile[] files = engine.getNext(25);
    idx += files.length;
   
    for(int i=0; i < files.length; i++) {
     FTPFile file= files[i];
     System.out.println(StringUtils.rightPad(" "+file.getName(),30) + StringUtils.leftPad(""+file.getSize(), 10) + " ");
    
    }
   }
  
   System.out.println("-" + StringUtils.leftPad("-", 30, "-") + StringUtils.leftPad("-", 10, "-") + "-");
   System.out.println(" total : " + idx);
   System.out.println();
    
   if(logger.isDebugEnabled()) {
    System.out.println("서버 디렉토리 리스팅  : " + path + "완료" );
   }
  } catch (Exception e) {
   System.out.println("ftp 리스팅 실패");
   e.printStackTrace();
   System.exit(-1);
  }
 
 }
*/

 /**
  *
  * @param day
  * @return
  */
 public static String getDate(int day){
  Calendar temp = Calendar.getInstance();
  StringBuffer sDate = new StringBuffer();
 
  temp.add(Calendar.DAY_OF_MONTH, -1);
 
  int iYY = temp.get(Calendar.YEAR);
  int iMM = temp.get(Calendar.MONTH)+1;
  int iDD = temp.get(Calendar.DAY_OF_MONTH);
 
  sDate.append(iYY);
  if(iMM <10)
   sDate.append("0");
  sDate.append(iMM);
 
  if(iDD < 10)
   sDate.append("0");
  sDate.append(iDD);
 
  return sDate.toString();
 }
}

java Framework/JSP] taglib prefix=c 로 사용시 에러 발생하는 경우



출처 : http://ck1024.tistory.com/14

-<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>" 으로 작성을 했더니 아래의 에러가 발생
→ According to TLD or attribute directive in tag file, attribute value does not accept any expressions

"<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>"으로 수정하니 정상적으로 실행됨


Servlet 2.3
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>

Servlet 2.4
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>