2010.06.22 19:35
윈도우 계열의 개행문자 0D0A
유닉스 계열의 개행문자 0A

윈도우에서 편집된 소스가 유닉스에서 컴파일시 개행문자때문에 오류가 날수 있음..
이때는 개행문자를 변경 해줘야 함...

ultra에서 ctrl+h 후 0D0A --> 0A로 변경..

서버로 올릴때 ascii로 올리면 안됨...

vi로 편집시 dos모드로 열리는지 확인 해야 함..

Posted by 달나라임금

댓글을 달아 주세요

  1. MBA dissertations 2012.04.24 14:09  댓글주소  수정/삭제  댓글쓰기

    This is extremely helpful info!!! Especially since you guys are offering it for free!! Very good listing. Everything is true. Thanks.

2009.11.11 10:33

########################################################################################
########################################################################################
########################################################################################
[TIP] Power Manager .. (즉 전원관리)

..  Solaris 2.6에서는 "powerd" daemon이 실행되어 일정 시간동안 작업을 하지 않으면 시스템이 자동 down되도록 지정할 수 있다. 이 Power Manager는 OS를 설치하는 과정에서 enable/disable 할수 있으며, OS를 설치 한 후에도 아래의 관련 화일들을 이용하여 구동할 수 있다.

1. Starting Script

powerd daemon은 시스템이 booting되는 과정에서 /etc/rc2.d/S85power 스크립트가 실행되면서 pmconfig 명령에 의해 구동된다.

Power Manager 기능을 사용하지 않으려면 /etc/rc2.d/S85power 화일을 다른 이름의 화일로 move 시킨다.

2. Configuration File

Power Management를 위한 configuration 화일은 /etc/power.conf 이며 pmconfig 명령에 의해 참조 된다.

System down에 관한 사항은 아래와 같이 지정할 수 있다.

#Auto-Shutdown Idle(min) Start/Finish(hh:mm) Behavior
autoshutdown 30 9:00 9:00 shutdown

위와 같이 지정하면 30분 동안 시스템이 사용되지 않으면 시스템이 down 된다.

powerd daemon이 구동중이라 하더라도 시스템이 down되지 않게 power.conf 화일에 지정하려면 아래와 같이 4번째 항목에 "noshutdown" 으로 지정한다.

#Auto-Shutdown Idle(min) Start/Finish(hh:mm) Behavior
autoshutdown 30 9:00 9:00 noshutdown 
########################################################################################
########################################################################################
########################################################################################
[TIP] 한글 입력이 안되는 경우 조치방법

% env | grep LANG
LANG=ko

위와 같이 결과가 나오지 않으면 아래와 같이 지정한다.

1. csh을 사용하는 경우

% setenv LANG ko
% stty cs8 -istrip -parenb

2. sh 이나 ksh을 사용하는 경우

$ LANG=ko
$ export
$ stty cs8 -istrip -parenb

위의 내용을 아래와 같이 .cshrc화일이나 .profile에 설정하여 다음에 새로
login 을 했을 때도 적용이 되도록 한다.

3. csh을 사용하는 경우

% vi ~/.cshrc
setenv LANG ko
stty cs8 -istrip -parenb

4. sh 이나 ksh을 사용하는 경우

$ vi ~/.profile
LANG=ko
export
stty cs8 -istrip -parenb

########################################################################################
########################################################################################
########################################################################################
[TIP] 사용자별 디스크 사용량 제한하는 방법

1. 개요

각 유저당 disk block이나 inode 수를 제한해서 디스
크의 사용을
제한할 수 있다.

2. setting Quotas
 
# su
# vi /etc/vfstab
  /dev/dsk/c0t3d0s7  /dev/rdsk/c0t3d0s7 
 /home ufs 2 yes rq

Quota를 사용하려고 하는 filesystem에 먼저 quotas
file를 만들어 주어야한다.

 
# touch /home/quotas
# chown root /home/quotas
# chmod 600 /home/quotas

 
각 사용자의 사용량을 할장
 
# /usr/sbin/edquota user1    
  ~   
  fs /home  blocks (soft = 0, hard = 0) inode
(soft = 0, hard = 0)   
  ~

 
* edquota [ -p proto_user] user ..........
여러사용자들의 Quota를 만들고자 할때 -p option을
사용해서 proto_user의 값과 동일하게 설정한다.
 
* edquota -t user1 user2 ....
fs /home blocks time limit = 3.50 days, files time
limit = 3.50 days
 
위의 예제에서 t option을 이용하여 time limit를
setting한다.
time limit setting이란 생성된 file이 setting된 기
간이 경과되면(단 수정된 file의 경우) soft limit까
지 자동으로 소멸된다는 것이다. 그러므로 주의를 요
한다. default값은 7.0 days
 
quota and repquota : View Quotas
# quota user1
 
* 만약 soft limit를 초과하면 경고를 뿌려주고,
hard limit를 초과하면 더 이상의 file writting이 않
된다.

* 1 block은 1024 byte이고 unlimit로 setting하는 경
우는 0으로 setting하면 된다.

3. checking Quotas

각 partition의 사용자별 사용량을 KB단위로 보여준
다.
 
# quot /dev/dsk/c0t2d0s7   
 /dev/dsk/c0t2d0s7 (/home) :   
 711024    root
 498     user1   
 302     user2   
 1      user3   
 1      ser4   
# quot -a (모든 partition의 사용자별 사용량을 KB단
위로 보여준다)   
# quot -f /dev/dsk/c0t2d0s7 (block size 뿐만아니
라 file count도 보여준다.)
# repquota -v -a   
# quota -v user1

########################################################################################
########################################################################################
########################################################################################
[정보] 기본적인 에러메세지라네요...

마주치게될지도 모르는 에러 메세지들
-----------------------------------------
Login incorrect
- 유효하지 않은 ID 그리고(또는) Password일때. 이것은 아무른 의미도 없다. UNIX에서는 유효한 사
용자 ID를 추측해낼 방법이 없다. 접속해 들어가고자 할때 이 메세지를 마주치게 될지도 모른다.

No more logins
- 시스템이 더 이상의 사용자를 받아들이지 않고자 할때 나타난다(다운될수도 있으므로).

Unknown id
- 유효하지 않은 id가 (su) 명령어를 사용하여 입력되었을때 발생.

Unexpected eof in file
- 파일이 손상되었을때.

Your password has expired
- 비록 이러한 경우가 있기는 하지만 드물다. /etc/shadow 파일에서 password가 변하는 기간을 알수 있다.

You may not change the password
- 아직 password가 충분한 기간동안 사용되지 않았다. 관리자가 그 기간을 정한다.

Unknown group [groups name]
- chgrp명령이 실행되었을때, 그 group이 존재하지 않으면 발생한다.

Sorry
- 유효하지 않은 수퍼 유저 패스워드를 입력했음을 나타냄 (su명령의 실행시)

Permission denied!
- 패스워드를 바꿀때 반드시 owner이거나 수퍼 유저이어야 함을 나타냄.

Sorry <[# of weeks] since last change
- 충분한 기간이 지나지 않았는데 패스워드를 바꾸고자 할때.

[directory name]: no permission
- 권한이 없는 디렉토리를 지우고자 할때.

[file name] not removed
- 쓰기 권한이 없는 다른 사용자 소유의 파일을 삭제하고자 할때.

[dirname] not removed
- 지우고자 하는 디렉토리의 권한이 없을때.

[dirname] not empty
- 디렉토리에 파일이 있을때. 그러므로 rmdir 명령을 수행하기 위해서는 파일들을 먼저 지워야 한다.

[command] not found
- UNIX에 유효하지 않은 명령을 입력했을때

can't execute pwd
- 시스템에 문제가 있어 pwd 명령을 수행할수 없을때

cannot chdir to ..
- (.. 한단계 위의)권한이 요구될때. pwd명령 수행시.

cant open [file name]
- 잘못된 경로, 파일 이름, 또는 읽기 권한이 없을때

cp:[file name] and [file name] are identical
- 말 그대로임

cannot locate parent directory
- mv 명령 사용시 발생

[file name] not found
- 이동시키고자 하는 파일이 존재하지 않을때.

You have mail
- 말 그대로임


기본적인 네트워킹 유틸리티 에러 메세지들
---------------------------------------

cu:not found
- 네트워킹이 설치되지 않음

login failed
- 유효하지 않은 id/pw 또는 틀린 번호

dial failed
- 틀린 번호때문에 시스템이 응답하지 않음

uucp completely failed
- -s 다음에 파일을 명시하지 않음

wrong time to call
- 시스템 파일에 명시되지 않은 시간에 호출했을때

system not in systems
- 시스템 파일에 없는 원격 호스트를 호출했을때

모르는 분들에게 도움이 되기를...
ㅎㅎㅎ ^^........
########################################################################################
########################################################################################
########################################################################################
[TIP] 시스템이 shutdown된 후 부팅이 안될때

..  시스템이 shutdown된 후 부팅이 안됩니다.


♣ 서버를 운영하다 갑작스런 정전이나 부주의로 시스템이 shutdown됐을때...
1) 시스템이 싱글모드로 떨어지는 경우

WARNING - unable to repair the file system, Run Fsck
manually (fsck -F ufs /dev/rdsk/c0t0d0s0) Exit ther shell whern
done to continue the boot precessor

Type Ctrl-d to preceed with normal startup
(or give root password for system maintenance):

☞ 해결책 : 위와 같은 경우는 파일시스템이 깨져서 나타나는 현상으로 아래와 같이 조치하세요.


ok> boot cdrom -s ---- cd 로 single mode 부팅
# fsck -F ufs /dev/dsk/c0t0d0s0
에러가 생기는 디스크를 선택해서 file system 체크
기술자료란의 fsck 참조

 

2) booting시 bootblock을 못 찾을때 조치사항
..
Boot device: /iommu/sbus/espdma@f, 400000/esp@f, 800000/sd@3,0 File and args:
bootblk: can't find the boot program
Program terminated
Type help for more information
ok>

☞ 해결책 : 위와 같은 경우는 부트 디스크의 부트블럭이 깨진 경우로 아래와 같이 조치하세요


Cdrom drive에 O/S cdrom을 넣은 후
ok> boot cdrom -s ----> single mode로 booting

# uname -a ---> 서버의 아키텍처를 확인 (sun4u)
SunOS ns 5.7 Generic_106541-11 sun4u sparc SUNW,Ultra-1
# cd /usr/platform/sun4u/fs/ufs
# installboot bootblk /dev/rdsk/c0t0d0s0
----> boot block install(부트디스크의 SCSI ID 확인)
# reboot

 
 
########################################################################################
########################################################################################
########################################################################################
[정보] 솔라리스 9에서의 패치 프로의 설치

솔라리스 9에서는 smc에 의해서 패치 관리가 가능합니다
이기능을 사용하기 위해서는 patch pro 를 설치 하셔야 합니다.
현재 버전이 2.1 이고
https://sunsolve.sun.com/patchpro/
여기에 가시면 받으실수 있습니다.
먼저 같이 가보실까요?
여기에 가면 동의 해야 합니다 .
동의 하시고 맨 아래 솔라리스 9 를 위핸 패치 프로가 있습니다.
그럼 설치..

tar.gz 로 되어 있으니 gunzip 과 tar를 이용해서 푸시고
설치를 시작하세요

맨먼저 path와 man path를 환경 파일에 넣어 줍니다. 아래와 같이.
Bourne shell:
PATH="/opt/SUNWppro/bin:${PATH}"; export PATH
MANPATH="/opt/SUNWppro/man:$MANPATH"; export MANPATH

Csh:
setenv PATH "/opt/SUNWppro/bin:${PATH}"
setenv MANPATH "/opt/SUNWppro/man:$MANPATH"

그리고 나서 root 로 설치를 합니다.

설치가 끝나고 sunsolve에 아뒤를 등록해야 합니다. id가 없으신 분은 sunsolve.sun.com에 가셔서 id를 만듭시다.
아래 처럼 합니다. user_id는 id를 넣으시고 your_passwd는 패스워드를 넣으세요
pprosetup -u user_id
echo your_passwd > /opt/SUNWppro/lib/.sunsolvepw
위에 것이 안되면 /opt/SUNWppro/lib/.sunsolvepw 파일을 삭제 하고 해보세요..

패치서버의 위치를 넣어 줘야 합니다. 넣지 않아도 default로 설정이 되어 있습니다

Americas (default)
https://americas.patchmanager.sun.com/patchmanager/
Europe https://emea.patchmanager.sun.com/patchmanager/
Japan https://japan.patchmanager.sun.com/patchmanager/

사용하는 방법은 아래와 같이 서버 를 넣습니다. your_server 대신에 위에 3개중 하나를 넣습니다.

pprosetup -P your_server
이건 옵션입니다. 프록시를 사용한다면 넣구요 안쓰신다면 안함 됩니다.
pprosetup -x your_proxy:your_proxy_port


문제 가 생기면 이것을 확인 해보십시요
/etc 가 0755 퍼미션을 가졌는지
그리고
/var/sadm/install/admin/default
이 파일에
conflict=nocheck
이렇게 되었는지확인을 해보세요....

그리고 나서는 이렇게 따라 하세요......
# /usr/j2se/jre/bin/keytool -import -alias smicacert \
-file /etc/certs/SUNW/smicacert.b64 \
-keystore /usr/j2se/jre/lib/security/cacerts

A sample run is shown as follows:

Enter keystore password: changeit
Owner: O=Sun Microsystems Inc, CN=Sun Microsystems Inc CA (Class B)
Issuer: CN=Sun Microsystems Inc Root CA, O=Sun Microsystems Inc, C=US
Serial number: 1000006
Valid from: Mon Nov 13 11:23:10 PST 2000 until: Fri Nov 13 11:23:10 PST 2009
Certificate fingerprints:
MD5: B4:1F:E1:0D:80:7D:B1:AB:15:5C:78:CB:C8:8F:CE:37
SHA1: 1E:38:11:02:F0:5D:A3:27:5C:F9:6E:B1:1F:C4:79:95:E9:6E:D6:DF
Trust this certificate? [no]: yes
Certificate was added to keystore

# /usr/j2se/jre/bin/keytool -import -alias smirootcacert \
-file /etc/certs/SUNW/smirootcacert.b64 \
-keystore /usr/j2se/jre/lib/security/cacerts

A sample run is shown as follows:

Enter keystore password: changeit
Owner: CN=Sun Microsystems Inc Root CA, O=Sun Microsystems Inc, C=US
Issuer: CN=GTE CyberTrust Root, O=GTE Corporation, C=US
Serial number: 200014a
Valid from: Tue Nov 07 14:39:00 PST 2000 until: Thu Nov 07 15:59:00 PST 2002
Certificate fingerprints:
MD5: D8:B6:68:D4:6B:04:B9:5A:EB:34:23:54:B8:F3:97:8C
SHA1: BD:D9:0B:DA:AE:91:5F:33:C4:3D:10:E3:77:F0:45:09:4A:E8:A2:98
Trust this certificate? [no]: yes
Certificate was added to keystore

Note that the default password for Java keystore is "changeit". We
recommend that you change it to a non-default password, by running
keytool as follows:

# /usr/j2se/jre/bin/keytool -storepasswd -keystore
/usr/j2se/jre/lib/security/cacerts

You will be prompted for old and new passwords.


STEP 2. Import Sun patch signing certificate into the Java system
keystore. To import the certificates, run the following command as
root:

# /usr/j2se/bin/keytool -import -alias patchsigning -file \
/opt/SUNWppro/etc/certs/patchsigningcert.b64 -keystore \
/usr/j2se/jre/lib/security/cacerts

A sample run is shown as follows:

Enter keystore password: changeit
Owner: CN=Enterprise Services Patch Management, O=Sun Microsystems Inc
Issuer: O=Sun Microsystems Inc, CN=Sun Microsystems Inc CA (Class B)
Serial number: 1400007b
Valid from: Mon Sep 24 13:38:53 PDT 2001 until: Sun Sep 24 13:38:53 PDT 2006
Certificate fingerprints:
MD5: 6F:63:51:C4:3D:92:C5:B9:A7:90:2F:FB:C0:68:66:16
SHA1: D0:8D:7B:2D:06:AF:1F:37:5C:0D:1B:A0:B3:CB:A0:2E:90:D6:45:0C
Trust this certificate? [no]: yes
Certificate was added to keystore

따라 하시면 되고요 한글 언어 팩이라면 no/yes 대신에 예/아니오로 물을수 도 있습니다..
참고 하세요..
########################################################################################
########################################################################################
########################################################################################
[정보] ls에 색깔을 넣자.

ls 하면 밋밋해서 싫죠??
솔라리스 8을 쓰신다면
sunfreeware에서 fileutil 이라는 패키지가 있습니다 이걸 까시고 설치 하시고요.. 그럼
ls가 /usr/local/bin에 깔리낭 아마 그럴께에요
그리고 나선
본인의 쉘에다가
alias ls="/usr/local/bin/ls --color" 이라고 해주심 됩니다.
alias 는 쉘마다 쪼금씩 틀리기 땜시 .. 자기 환경에 맞추시고
9버전을 쓰신다면 www.gnu.org 에서 검색하셔서..ㅎㅎㅎ
http://ftp.gnu.org/pub/gnu/fileutils/fileutils-4.1.tar.gz 이거 링크니까 이거 받으셔서..
설치 하시면.. 사용이 가능합니다. ^^;;.. 안되심 리플 달아 주세요..
########################################################################################
########################################################################################
########################################################################################
[TIP] 날자별로 변경되는 파일 가져오기

ftp로 매일 변경되는 파일ex> 20030101로 되는 파일 가져오기

#!/usr/bin/ksh
file=$( date +"%Y%m%d" )

ftp -n black1 > ftp.log << EOF
user node sait00
hash
prompt
cd log
get $file
quit
EO
   
########################################################################################
########################################################################################
########################################################################################
[TIP] process 관련 명령어.. ps 이외의 명령어입니다. [공통]

프로세스 상태를 추적, 관리하기


프로세스의 상태를 체크하기 위해 ps 명령어나 proctool, top 등을 써 보았을 것입니다.그런
데 많은 분들이 유용하게 사용할 수 있는 명령어들을 몰라서 소개해 놓았습니다.
프로세스를 관리하는 명령어들이 /usr/proc/bin에 있으므로 PATH를 추가하면 이후 내용을
해보기가 쉽겠죠
본,콘쉘 상태에서
#PATH=/usr/proc/bin:$PATH;export PATH

1. ptree :프로세스 트리구조를 보여준다
# ps -ef |grep netscape 해서 나온 결과가
dol 669 655 82 18:58:20 ? 65:55 /opt/netscape/netscape

프로세스 아이디가 669번 이므로
#ptree 669
269 /usr/dt/bin/dtlogin -daemon
541 /usr/dt/bin/dtlogin -daemon
561 /bin/ksh /usr/dt/bin/Xsession
613 /usr/dt/bin/sdt_shell -c unset DT; DISPLAY=:0;
/usr/dt/bin/dt
616 -ksh -c unset DT; DISPLAY=:0;
/usr/dt/bin/dtsession_res -merg
655 /usr/dt/bin/dtsession
669 /opt/netscape/netscape
676 (dns helper)

위의 결과를 보면 269번 dtlogin이 dtlogin을 생성한뒤 dtlogin이 561번을 생성 561번이 613
을 등등등.... 669번의 netscape 가 676번을 호출한 것을 알 수 있다.

2. pstop : 프로세스를 정지한다
#pstop 669
netscape 을 잠시 정지한다

3. prun : 프로세스를 다시 시작한다
#prun 669
netscape 을 다시 시작한다

4 pcred : 프로세스의 보안정보 표시
#pcred 669
669: e/r/suid=101 e/r/sgid=14
effective,real saved(u/g)id를 표시한다.


5. 프로세스의 메모리 맵상의 정보 표시
#pmap 669
669: /opt/netscape/netscape
00010000 13124K read/exec /opt/netscape/netscape
00CF0000 988K read/write/exec /opt/netscape/netscape
00DE7000 15816K read/write/exec [ heap ]
EEE60000 8K - [ anon ]
메모리 주소번지와 메모리 세그먼트의 사이즈를 표시한다.

6. pflags : 프로세스와 플래그 정보, 시그널 핸들링 상태 등을 표시
#pflags 669
669: /opt/netscape/netscape
data model = _ILP32 flags = PR_ORPHAN
/1: flags = PR_PCINVAL|PR_ASLEEP [ poll(0xef201a00,0x5,0xa603) ]
sigmask = 0x00002000,0x00000000 lwppend = 0x00002000,0x00000000
플래그와 시그널 핸들링 상태 등을 표시한다 .

7. pldd : 다이나믹 라이브러리에 링크된 정보 표시
#pldd 669
669: /opt/netscape/netscape
/usr/dt/lib/libXm.so.3
/usr/openwin/lib/libXt.so.4
/usr/openwin/lib/libXmu.so.4
/usr/openwin/lib/libXext.so.0
/usr/openwin/lib/libX11.so.4
...
링크된 다이나믹 라이브러리들 표시해준다.

8. ptime : 수행 시간 표시
#ptime ls
dtdbcache_:0 ps_data sdtvolcheck677 speckeysd.lock
real 0.166
user 0.029
sys 0.057
실제 수행시간, 유저프로세스시간, 시스템 프로세스 시간을 보여 준다 .

9. pfiles : open한 파일 표시
#pfiles 669
669: /opt/netscape/netscape
Current rlimit: 64 file descriptors
0: S_IFCHR mode:0620 dev:32,24 ino:76843 uid:101 gid:7 rdev:24,2
O_RDWR|O_LARGEFILE
1: S_IFCHR mode:0666 dev:32,24 ino:76599 uid:0 gid:3 rdev:13,2
해당 프로세스와 연관된 파일들과 열수 있는 파일갯수를 확인 할 수 있다.

10. pwdx 프로세스의 현재 디렉토리 표시
#ps -e |grep cmdtool
#pwdx 669
669: /w/dol

11. pwait : 프로세스가 끝날 때까지 기다림
#ps -e | grep cmdtool
273 console 0:01 cmdtool
281 console 0:01 cmdtool
중간에 281을 kill 한다
# pwait -v 281
281: terminated, wait status 0x0000

12. psig : 프로세스의 시그널 처리 성향 표시
#psig 669
669: /opt/netscape/netscape
HUP caught 0
HUP,INT,QUIT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR
2,CLD,PWR,WINCH,URG,POLL,TSTP,CONT,TTIN,TTOU,VTALRM,PROF,XCPU,XFSZ,W
AITING,LWP,FREEZE,THAW,CANCEL,LOST,RTMIN ....
시그널 처리 성향을 보여준다.

13. pstack : 스택의 점유상태 표시
#pstack 669
669: /opt/netscape/netscape
ef31437c poll (ef201a00, 5, 29bb)
ef2ce3dc select (ef201a28, ef201c70, ef334ffc, ef201c74, ef335000, 1d) + 298
Hex값과 심볼릭 값으로 스택에 있는 상태 표시, 만일 문제가 생긴 프로세스이면 어디에서
프로세스가 정지 했는지 확인 할 수 있다.

########################################################################################
########################################################################################
########################################################################################
[TIP] floppy disk ufs filesystem format 하기.... [공통]

1. floppy diskette을 drive에 넣고 아래와 같이 fdformat 명령을 실행한다.

# fdformat -U -b "label-name"
Formatting 1.44 MB in /vol/dev/rdiskette0/no_name
Press return to start formatting floppy.
..................................................................
#

위의 명령중 각 option 의 내용은 아래와 같다.

-U : floppy diskette이 이미 mount 된 경우라도 umount하여 format한다.
-b : diskette의 label 이름을 지정하기 위한 option이다
"label-name" : diskette에 지정할 label 이름이다.
이 이름은 floopy diskette 을 mount하였을때 생기는 실제
mount point(/floppy/"label-name")의 이름이 된다.

2. format 이 정상적으로 끝나면 "newfs" 명령을 실행하여 filesystem을 만든다.

# newfs /dev/rdiskette0

만약 위의 명령을 실행했을때 아래와 같이 error message가 발생하면 volume manager
daemon인 "vold" 를 종료시킨 후 다시 newfs 명령을 실행한다.

# newfs /dev/rdiskette0
/dev/rdiskette0: Device busy

# ps -ef|grep vold
root 267 1 0 11월 28 ? 0:02 /usr/sbin/vold
^^^^^
vold process id
# kill 267
# newfs /dev/rdiskette0
newfs: construct a new file system /dev/rdiskette0: (y/n)?

위와 같이 new file system을 만들것인지 물어보면 "y"와 "retunrn" key를 친다.

3. newfs가 정상적으로 끝나면 "vold" process가 실행중인지 확인한 후, 실행중이
아니면 vold를 실행한다.

# ps -ef|grep vold
root 8321 1 1 17:26:20 ? 0:00 /usr/sbin/vold

위와 같이 결과가 나오지 않으면 아래와 같이 명령을 실행한다.

# /etc/init.d/volmgt start
volume management starting.

4. "volcheck" 명령을 실행하여 floppy diskette을 mount한후 "df" 명령으로 mount가
되었는지 확인한다.

# volcheck
# df -k
파일시스템 K바이트 사용 가용 용량 설치지점
/dev/dsk/c0t0d0s0 1813958 696114 1063426 40% /
/proc 0 0 0 0% /proc
fd 0 0 0 0% /dev/fd
/vol/dev/diskette0/"label-name"
1263 9 1128 1% /floppy/"label-name"

위의 결과중 "label-name"은 diskette을 format 할때(fdformat) 지정한 label
name 이다.

########################################################################################
########################################################################################
########################################################################################
[TIP] 파일 확장자 한꺼번에 바꾸기...shell script [공통]


유닉스에서 불편한점은 여러개의 확장자가 같은 파일의 확장자를 한꺼번에 이름을 바꾸어주려면 매우 불편합니다.

예를 들어..
test.tot 를 test.txt 로 바꿔줘야 한다면.. 간단하죠..
$ mv test.tot test.txt 이렇게 하면 됩니다.

하지만 test.tot, test1.tot, test3.tot 등 2개이상의 파일을 한꺼번에
test.txt, test1.txt, test3.txt로 바꿔줘야 할 때는?

음... 이거 문제입니다.. ㅡㅡ;
한꺼번에 바꿔주는 명령이 유닉스에서는 존재하지 않습니다. ㅡㅡ;

이걸 쉘 프로그램으로 해결 했습니다.
그럼..아래의 텍스트를 복사해서 그대로 파일로 만들어 쓰시기 바랍니다.

복사한 다음에는 반드시 다음과 같은 명령을 내리셔야합니다.
스크립트 이름을 ext.sh 라고 가정한다면..

# chmod 755 ./ext.sh -> 실행권한을 주는겁니다.
# ./ext.sh -> 실행합니다.

그럼.. 다음을 vi 로 작성하시면 됩니다.

============= 파일 시작 ==================
#!/bin/ksh
# Script Name : ext.sh
# Program Explan : change extention of all files in curent director
# by vivakim
# 2003. 2. 7
# !! Coution !!
## This Progrm is only in xxx.xxx file used
# The Other files is unusable
##################################################3

echo "insert source ext : \c" # source extention input
read X2
echo "insert result ext : \c" # Result extention input
read R2

if [[ "$R2" = "" ]] || [[ "$X2" = "" ]] # argument check
then
echo "insert two args"
exit 1
fi

ls *.$X2 > tmpfile 2> /dev/null # save file

if [[ $? != 0 ]] # extention check
then
echo "$X2 is not found"
exit 2
fi

IFS='.' # Field seperator setting in '.'

while read X1 X2 # X1 is filename X2 is extention
do
EXTS="$X1.$X2" # EXTS is source entire filename
EXTR="$X1.$R2" # EXTR is Result entire filename
mv "$EXTS" "$EXTR"
echo "$EXTS to $EXTR change sucess"
if [[ $? != 0 ]] ; then
echo " $EXTS to $EXTR change false "
exit 3
fi
done < tmpfile
rm tmpfile # tmp file deleted

Posted by 달나라임금

댓글을 달아 주세요

2009.11.02 18:30

--> You may need to run PUPBLD.SQL as SYSTEM
 - system 계정으로 pupbld.sql( /opt/ora9/product/9.2/sqlplus/admin/pupbld.sql ) 실행
Posted by 달나라임금

댓글을 달아 주세요

2009.10.30 15:11

./runInstaller -ignoreSysPreReqs
Posted by 달나라임금

댓글을 달아 주세요

2009.04.24 10:05

CWebBrowser2 (웹브라우저) 컨트롤에서 스크롤바 없애기  윤덕근 / yunskorea  
#include <mshtml.h>
void CWebDlg::OnDocumentCompleteBrowser(LPDISPATCH pDisp, VARIANT FAR* URL) 
{
IDispatch *pDisp2 = m_ctlWebBrowser.GetDocument();

CString strOption = _T("no" );   // yes no auto

if (pDisp2 != NULL)
{
IHTMLDocument2* pHTMLDocument2;
HRESULT hr;
hr = pDisp2->QueryInterface(IID_IHTMLDocument2, (void**)&pHTMLDocument2);

if (hr == S_OK)
{
IHTMLElement *pIElement;
hr = pHTMLDocument2->get_body(&pIElement);

IHTMLBodyElement *pIBodyElement;
hr = pIElement->QueryInterface(IID_IHTMLBodyElement, (void**)&pIBodyElement);

BSTR bstr;
bstr = strOption.AllocSysString();
pIBodyElement->put_scroll(bstr);
}
pDisp2->Release ();
}   
}
Posted by 달나라임금

댓글을 달아 주세요

  1. HR Dissertation 2011.06.29 15:38  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 ...
    나는 또한 당신의 블로그를 읽고 ... 어떤 꿈을 와우!
    당신의 COM을 가져 주셔서 감사합니다
    우리의 새로운 모험에 대해 곧 당신을보고!

2009.04.14 15:58
 

1. Data type

비고 : oracle

Datatype 설 명
VARCHAR2(size) size 만큼 2000개까지 문자열 데이터 저장. 가변형.
CHAR(size) size 만큼 255개 문자까지 문자열 데이터 저장. 고정형.
NUMBER 실수형 데이터 저장 NUMBER(p,s)
NUMBER(p,s) 숫자데이터를 저장. p는 최대자리수, s는 소수점 이하 자리수
DATE BC 4712년 1월 1일부터 AD 4712년 12월 31일까지의 날짜를저장
* 기본 날짜 형식은 'DD-MON-YY' 임
LONG 2GB의 문자까지 문자열 데이터를 저장.
비고사항 * CHAR과 VARCHAR2의 사용
- 데이터의 update가 잦은 칼럼은 char형은 씀.
- 한 칼럼에서 고정된 길이의 데이터를 입력할 경우는 char형,
가변형길이의 데이터를 입력할 경우는 varchar를 사용.
비고 : MS-SQL
Datatype 설 명
VARCHAR2(size) 가변길이 문자열. 자신의 실제길이로 저장됨.
CHAR(size) 고정 문자열, 최대값은 8000
NCHAR(n) 고정길이 유니코드 문자셋 저장. CHAR는 1바이트를 사용함에비해,
NCHAR는 2바이트를 사용. 최대 4000.
NVARCHAR(n) 가변길이 유니코드 문자셋.
TEXT(n) 최대 2GB까지의 고정길이 문자열 저장
NTEXT(n) 큰 가변 길이 문자 데이터 저장. TEXT는 1바이트, NTEXT는 2바이트사용.
INT 정수값 표현. 4바이트.
SMALLINT 정수값 표현. 2바이트(-32768~32767
TINYINT 음이 아닌 정수값 표현. 1바이트(0~255)
DECIMAL(p,[s]) 고정 소수점 값.
NUMBER(p,[s]) DECIMAL과 동의어.
REAL 부동소수점 값
FLOAT[(p)] 부동소수점 값
MONEY 화폐값을 표현 하는 데 사용. 8바이트
SMALLMONEY MONEY와 같지만, 4바이트 사용.
DATETIME 4바이트의 정수값으로 저장되는 DATE와 TIME을 저장.
SMALLDATETIME 2바이트의 정수값으로 저장되는 DATE와 TIME을 저장

비고 : Informix
Datatype 설 명
VARCHAR(a,b) 가변길이 문자열. 자신의 실제길이로 저장됨. Max 255
CHAR(size) 고정 문자열, 최대값은 32767 byte
TEXT 최대 2GB까지의 고정길이 문자열 저장 blobspace공간을 만들어저장하는 것이 IO향상됨
Byte 최대 2Gb까지의 바이너리 데이터 저장blobspace공간을 만들어별도로 저장
INT 정수값 표현. 4바이트.
SMALLINT 정수값 표현. 2바이트(-32768~32767
SERIAL 서버에 의해 자동적으로 1씩 증가 내부적 int와 동일
DECIMAL(p,[s]) 고정 소수점 값. ? 숫자형은 모두 decimal로 하는 것이 좋다.엔진에서 decimal로 처리
REAL 부동소수점 값
FLOAT 16자리 부동소수점 값
SMALLFLOTE 8자리 부동 소수점
MONEY 화폐값을 표현 하는 데 사용. Decimal 형태로 저장되며 $와 소수점뒤에 두자리 표시 DBMONY=’\’;export DBMONEY
DATETIME INTERVAL 4바이트의 정수값으로 저장되는 DATE와 TIME을 저장.
DATE 2바이트의 정수값으로 저장되는 DATE만 저장 DBDATE=y4md/;exportDBDATE

SQL3 type : Informix 9.x, oracle 8.x이상 버젼에서 비정형 데이더를저장, 검색하기 위한 확장형 타입과 ORDBMS의 특징인 object type을지원한다.
  • clob : 문자열 데이터를 저장
  • blob : 바이너리 데이터를 저장
  • list, multiset, set : 한 컬럼에 여러 데이터 저장
  • named row type, unnamed row type : type을 상속받아 테이블을생성할 수 있음
  • user define function 및 user define type을 생성
  • cast 함수를 이용하여 type의 확장지원
  • Informix : lvarchar,int8,Serial8 type 새롭게 지원


2. 데이터 저장 공간

비고 : oracle
- 데이터베이스(oracle instance당 한 개가 존재) >테이블스페이스(system, nonsystem tablespace로 나누어 장치간 적절히스토리지를 분배해야 함, 물리적인 공간) > 세그먼트 ( 테이블세그먼트, 인텍스 세그먼트, 임시세그먼트, 롤백세그먼트 :tablespace에 있는 여러 datafile에 걸처서 생성할 수 있음)>datafile(물리적 공간) > 익스텐트( 연속된 블록의 집합 ) >데이터 블록 (가장 작은단위의 저장공간)
비고 : MS-SQL
- 데이터 베이스 ( system database : master,tempdb,msdb,model userdatabase로 나누며 user database는 여러 개 생성할 수 있음 ) > 주데이터 파일( .mdf ), 보조 데이터 파일( .ndf), 로그 데이터 파일 (.ldf ) > 익스텐트 > 블럭
비고 : Informix
- dbspace ( system, nonsystem dbspace로 구별하여 생성해야 함 ) >chunk (물리적인 데이터 공간) > database ( 한 dbspace에 여러 개의데이터베이스 생성 가능 ) >chunk(물리적은 공간 cook device, rawdevice로 구성할 수 있음) > tablespace ( extent들의 연속된 공간 )> extent > page

3. 테이블 정보 보기 및 sql query tool

비고 : oracle-sqlplus를 이용해서 server에 connection

  • SELECT * FROM tab;
  • DESC table_name
비고 : MS-SQL
- Enterprise Manager를 이용해서 비주얼 볼 수 있음
비고 : Informix-dbaccess를 이용해서 볼 수 있음.
  • Dbaccess -> 메뉴에서 table -> database선택 ->table선택.
  • Dbshcema 툴을 이용
dbschema -ㅇ >>filename 하여 filename을 vi로 열어본다.
옵션을 보려면 dbschema - -


4. SQL 문 이용 가이드

4.1 NULL

비고 : oracle,Informix 동일
* 이용할 수도 없고, 값이 할당되어 있지도 않고, 알려져 있지않은
또는 적용불가능한 값을 의미.
* 0이나 공백(space)와 같은 것이 아님.
* NULL 값을 포함한 산술 표현식 결과는 NULL임.
NVL 함수 이용.
* NULL 값은 NVL함수를 이용하여 다른 값으로 대치할 수 있음.
* 사용가능한 datatype은 날짜, 문자 및 숫자형.
* 구문 : NVL(expr1, expr2)
expr1 : 널값을 포함할 수 있는 값이거나 표현식
expr2 : 널값을 전환하여 사용할 값
예 : NVL(hiredate, '01-JAN-95')
NVL(job, 'FRESH MAN')
NVL(comm, 1000)
권장 사항 : nvl함수를 자주 쓰는 것은 성능에 걸림돌이 될 수 있음.따라서 컬럼에 공백이 들어가지 않도록 하는 것이 성능향상에좋다.table을 생성할 때 default값을 주어 nvl 함수대신 default값을가지고 구분할 수 있도록 한다.

4.2 합성문자.

비고 : oracle,Informix 동일
* 칼럼과 문자 또는 칼럼과 다른 칼럼을 연결
* 두 개의 수직바(||)에 의해 이루어짐.
* 문자 표현식의 결과에 의해 새로운 칼럼이 생성됨.
SELECT ename||ename
FROM emp;
* Literal 이란 SELECT 리스트에 포함된 문자, 표현식 또는숫자임.
* 날짜 및 문자값은 단일 인용부호로 둘러쌈.
SELECT job||' is job of '||ename FROM emp;

4.3 조건절 사용

비고 : oracle
* 비교 연산자 : =, >, >=, <, <=
* SQL 연산자
- between .....and... : 두 값사이의 값
- in(list) : 리스트 중 하나와 같은 값을 가지는 값
- like : 문자 패턴과 일치하는 값
- is null : 널값인 것
* 논리 연산자 : and, or, not ( 우선순위 and -> or )
* 부정 연산자
- 비교 연산자 : !=(VAX,UNIX, PC), ^=(IBM), <>(all OS)
- SQL 연산자 : not between....and...., not in(list), not like, isnot null
비고 : Informix
  • 부정 비교 연산자는 <>를 쓴다.
  • Like는 %만을 이용하여 검색 가능하며, matches는 *만을이용한다.

4.4 함수

비고 : oracle
구문
* function_name(column|expr, [arg1, arg2,....])
- function_name : 함수의 이름
- column : 데이터베이스에 존재하는 칼럼명
- expr : 어떤 문자열 또는 계산된 표현식
- arg1, arg1,... : 함수에 의해 사용될 인수
* 함수는 데이터 값을 조작함.
* 인수를 받아들여 한 개의 값을 return
* 각각의 행에 적용됨.
* 행당 하나의 결과를 돌려줌
* datatype을 바꾸어 줌.
* 중첩하여 사용하는 것이 가능함.
문자함수
* LOWER(column/expr) : 알파벳 문자를 소문자로 바꾸어 줌.
* UPPER(column/expr) : 알파벳 문자를 대준자로 바꾸어 줌.
* SUBSTR(column/expr,m[, n]) : 문자값 중에서 m위치에서 n 문자길이에해당하는 문자를 돌려줌. Informix 에서는 substr을 써야만 index를탄다.
* LENGTH(column/expr) : 문자개수를 값으로 돌려줌.
* NVL(expr1, expt2) : 첫번째 값이 널이면 두번째 값으로 바꾸어줌.
예)SELECT ename, job, deptno FROM emp WHERE lower(job) ='clerk';
* LTRIM(‘ lee’); 공백을 왼쪽으로 밀어준다.
*RTRIM(‘Lee ‘);
숫자함수
* ROUND(column/expr, n) : column/expr의 값을 소수점 n자리까지반올림. n이 없으면 소수점은 없어지고, 음수라면 소수점의왼쪽자리만큼 반올림됨.
* TRUNC(column/expr, n) : column/expr의 값을 소수점 n자리까지 버림n이 없으면 소수점은 없어지고, 음수라면 소수점의 왼쪽자리만큼버림.
* MOD(m, n) : m값을 n으로 나누고 남은 나머지를 return

날짜함수
* date + number : 날수를 날짜에 더함. 결과는 date.
* date - number : 날짜에서 날수를 뺌. 결과는 date.
* date - date : 날짜에서 날짜를 뺌. 결과는 날수.
* date + date/24 : 시간을 날짜에 더함. 결과는 date
* MONTHS_BETWEEN(date1, date2) : 두 날짜 사이의 달수를찾아줌.
* ADD_MONTHS(date, n) : 날짜에 n달을 추가
* NEXT_DAY(date, 'char') : date 다음의 첫번째 해당요일('char')일자.
* LAST_DAY(date) : date를 포함하고 있는 달의 마지막날
예)select ename,(sysdate-hiredate)/7 weeks from emp where deptno =20
oder by week;
전환함수
* 숫자 또는 날짜값을 fmt 모델을 사용하여 varchar2 문자열로바꿈.
* TO_CHAR(date, 'fmt')
- fmt 형식모델은 단일 인용부호로 에워싸야 하고, 대소문자 구별이있음.
- 형식 모델은 어떠한 날짜 형식 요소도 포함할 수 있고,
날짜값은 콤마에 의해 구분됨.
- 결과에 일, 월의 이름은 자동적으로 공백으로 덧붙여 짐.
- 공백 및 선행제로를 없애기 위해서는 'fm'을 사용
* TO_CHAR(number, 'fmt') - 대소문자 구별
- 9 : 숫자위치(9의 수는 폭을 결정)
- 0 : 0을 나타냄
- $ : 달러기호 예) to_char(sal,’fm$9,999,999’)
- . : 위치에 소수점(999.999 -- > 123.2)
- , : 위치에 콤마 (999,999,999 -- > 1,234)
예) select ename, to_char(hiredate, ‘fmDD “of” Month YYYY’)start_date from emp
where hiredate like ‘%87’;
soctt 19 of April 1987 ß 결과값
* TO_NUMBER 함수
to_number(char) 예) to_number(to_char(empno))
* TO_DATE 함수
to_date(char[, ‘fmt’]) 예)to_date(‘1981/05/10’,’yyyy/mm/dd’);
그룹함수
* 그룹당 하나의 결과를 return
* 그룹함수들은 SELECT 절 및 HAVING 절에 쓸 수 있음.
* SELECT 문장에서 GROUP BY 절은 행들을 작은 그룹으로 나눔.
* HAVING 절은 그룹을 제한함.
그룹함수의 종류
* AVG() : 널값을 제외한 행의 평균값
* COUNT() : 행의 개수. expr은 널값이 아닌 것을, '*'를 사용하면 중복및 널값을 갖는 것도 포함.
* MAX() : 최대값 : 어떤 데이터 type도 쓴다.
* MIN() : 최소값: “
* STDDEV() : 널값을 제외한 표준편차
* SUM() : 널값을 제외한 합계
* VARIANCE() : 널값을 제외한 분산
비고 : Informix
함수명 설명 Ver.
날자함수 DATE DATE(char1) 비날자형 값을 날자로 변환 ALL
DAY DAY(d1) 날자형값중 일을 구함 ALL
MONTH MONTH(d1) 날자형값중 월을 구함 ALL
WEEKDAY WEEKDAY(d1) 날자형값중 요일을 구함 ALL
YEAR YEAR(d1) 날자형값중 년을 구함 ALL
EXTEND EXTEND(d1 날자형값을 지정한 길이로 조정함 ALL
MDY 비날자형 값을 날자로 변환 ALL
산술함수 ABS ABS(n) n의 절대값 구함 ALL
MOD MOD(m,n) m을 n으로 나눈 나머지 구함 ALL
POW POW(m) 값의 n제곱 구함 ALL
ROOT ROOT(m) 제곱근 구함 ALL
ROUND ROUND(m,n) m의 값을 n자리수 위치 기준으로 반올림 ALL
SQRT ALL
TRUNC TRUNC(m,n) m의 값을 n자리수 위치 기준으로 반올림 ALL
로그함수 EXP ALL
LOGN ALL
LOG10 ALL
삼각함수 SIN SIN 함수 ALL
COS COS 함수 ALL
TAN TAN 함수 ALL
ASIN ALL
ACOS ALL
ATAN ALL
ATAN2 ALL
String 함수 LENGTH LENGTH(char1) Charter 길이 구하기 ALL
TRIM TRIM(char1) 공백 자르기 ALL
집계함수 COUNT COUNT(*) 건수 구하기 ALL
AVG AVG(m) 평균 구하기 ALL
MIN MIN(n) 최소값 구하기 ALL
MAX MAX(m) 최대값 구하기 ALL
SUM SUM(n) 합 구하기 ALL
RANGE RANGE(m) 최대값과 최소값 차 구하기 ALL
STDEV STDEV(n) 표준편차 구하기 ALL
VARIANCE VARIANCE(m) 분산 구하기 ALL
기타함수 DBINFO DBINFO(KEYWORD) ALL
TODAY 오늘날자 ALL
CURRENT 현재 날자+ 시분초 ALL
USER 사용자 이름 ALL
SITENAME HOST명 구하기 ALL
DBSERVER
NAME
INFORMIXSERVER 명 구하기 ALL
NVL NVL(m,n) m값을 검사 NULL 이면 n값을 Return 7.3Y
DECODE DECODE(c1,a1,A1,b1,
B1,c1,C1,D1)
Multi-Case 문 7.3Y
CASE SELECT 문에서 CASE 비교 7.3Y
INITCAP INITCAP(char1) 첫글자 대문자 7.3Y
UPPER UPPER(char1) 대문자로 ALL
LOWER LOWER(char1) 소문자로 ALL
REPLACE REPLACE(char1,search_string[,replacement_string]) search_string 의 각 문자를 대응하는 replacement_string 으로치환 . replacement_string이 미지정이면
serach_string 을 제거
7.3Y
SUBSTR SUNSTR(char,m[n] char의 m번째 문자부터 n개의 문자를 취한다 . 7.3Y
LPAD LPAD(char1,n,[char2]) Char1의 왼쪽에 Char2를 덧붇여 전체가 n문자로 되도록한다 .Char2가 미지정이면 blank 적용 7.3Y
RPAD RPAD(char1,n,[char2]) Char1의 오른쪽에 Char2를 덧붇여 전체가 n문자로 되도록한다 .Char2가 미지정이면 blank 적용 7.3Y
SPL로 제공되는 함수 CEIL n 보다 크거나 같은 최소 정수
NEXT_DAY

4.5 Having절의 사용

Having 절에 조건을 줌으로서 그룹을 제한할 수 있다.
예) job이 vp로 시작하지 않는 사람들을 job별로 급여의 합계를구한다음 급여합계가 5000이상인 job과 그 합계를 구하라.
Select job,sum(sal) payroll from emp
Where job not like ‘VP%’ Group by job having sum(sal) >5000;

4.6 JOIN

Join을 쓰는 목적은 Cartesian product를 막고 정규화 된 테이블 간데이터를 가져올 때.
비고 : 오라클
  1. equi join
join시 table alias를 주어서 쓰는 것이속도 향상에 좋음.
  1. non-equijoin
  2. self join
같은 테이블에 대해 두개의 가명을줌.
  1. outer join : 정상적으로 조인 조건을 만족하지 못하는 행들을 보기위해
outer join의 연산자는 (+)를 붙임..모자라는 곳에 붙임..in 명령어 사용 못함.
SQL은 inner,outer join이라고명령을 써준다.

4.7 SubQuery

* subquery는 다른 SQL 문장안에 존재하는 SELECT 구문을 말함.
* 주 질의가 실행되기 전에 일단 한번 먼저 실행되어 그 결과는 주질의의 조건으로 사용됨.
* subquery에는 ORDER BY 절을 사용할 수 없음.
SELECT select_list
FROM tables
WHERE expr operator (SELECT select_list FROM table);
오라클은 where 조건절 및 from절에도 subquery ( inline View )를실행할 수 있지만 informix는 inline view가 지원되지 않는다.

4.8 HINT 사용

비고 : Informix
* SQL을 어떠한 방법으로 실행할 것인가를 결정을 optimizer에게 지시
  • index, join 방법을 지정할 수 있다.
  • INDEX, AVOID_INDEX, FULL, AVOID_FULL
  • ORDERED : join의 대상 테이블에 대한 join순서를 테이블 순서대로하도록 한다.
  • USE_NL,AVOID_NL,USE_HASH, AVIOD_HASH : NL은 nested loop join을말함.
  • FIRST_ROWS, ALL_ROWS (default)
  • FIRST N 질의 결과 중 n개의 row를 가져옴.
예) 1. select --+ index(esalary_index) name,salary from emp e
where e.dno=1 and e.salary >50000;
2. select {+ avoid_full(e), index(esalary_indx) } name, salary
where e.dno = 1 and e.salary >50000;
3. select --+ ORDEREDname,title,dept
from dept,job,emp where title = 'aaa'and emp.dno = dept.dno;
  1. select --+ first_rows name,age from employee e,department
where e.dept_no = d.dept_no;

4.9 ROWID

* 각 행의 주소를 반환하며, 반환되는 데이터는 ROWID 데이터타입을가짐.
* ROWID는 행에 접근하는 가장 빠른 방법임.
* 어떻게 테이블의 데이터 행들이 저장되었는 지 보여주고, 한 테이블의각 행에 유일성을 줌.
Select rowid,ename from emp;

4.10 ROWNUM

비고 : 오라클
* 검색될 테이블의 칼럼 데이터 행의순서를 반환하는 pseudocolumn이며, 첫번째 행은 1로 시작.
* ROWNUM을 이용하여 반환되는 행의 수를 제한할 수 있음
예) 사원중 급여를 적게 받는 사람 순서대로 다섯명을 나타내라.
select ename,sal from ( select ename, sal from emp group bysal,ename)
where rownum <= 5;
subquery에서는 order by를 쓸 수없으므로 같은 역할을 하는 group by를 이용
비고 : Informix
자체적인 함수가 제공되지 않는다.하지만 Informix ius 9.x버전부터 지원되는 UDF (user definefunction)을 만들어 활용할 수 있음.
비고 : SQL
top n [percent]구문
* 순위별로 체크하여 반환되는 행의수를 제한할 수 있음.
* 행의 개수를 쓰거나 percent 구문을 이용
with ties : 마지막 등수가 여러명일 때
예) select top 4 with ties employeeID, LastName, HireDate
fromEmployees order by hiredatedesc

4.11 테이블 생성

ansi 표준으로 만드는 것이 좋음.
비고 : Oracle: subquery를 이용한 테이블 생성방법
* As subquery를 이용하여 테이블 생성
* subquery에서의 컬럼수와 생성하는 컬럼이 일치해야 함.
* 컬럼명과 default 값, 무결성 제약조건만이 subquery를 이용해생성됨
* NOT NULL 만이 복사됨
예) create table emp_20 AS select empno,emame,hiredate,job
from emp where deptno = 20; -- 데이터 까지 복제..
비고 :Informix :
테이블을 DataBase가 저장된 space외에 다른 space에 생성할 수 있을뿐만 아니라 컬럼까지도 다른 space에 저장할 수 있다.
예) create table aaa ( a int, b char(10) in space2);
성능 향상 법 : 모든 DBMS에서 테이블을 생성시 테이블 저장량을예측하여, extend size 및 저장할 곳을 적절히 분산하여 생성해야 한다.또한 index 저장 할 곳도 각 DBMS성격에 맞게 구축해야 한다.
테이블이 대용량일 경우는 분할 하여 저장하는 것이 좋다.
-분할 방법 :
  • 가급적 remainder를 쓰지 않는다.
  • 여러 디스크에 분산하여 설계한다.
  • Expressino의 조건은 가급적 숫자형 type( date포함 )하는 것이좋다.
  • 테이블 전체에 거처 조회가 된다면 round robin방법을 쓰는 것이좋다.
  • 인텍스는 fragment하지 않고 별도의 dbspace 한곳에 저장한다.
  • 100만 건 이상의 테이블을 고려 대상으로 한다.
  1. round robin방법 : 컬럼이 insert시 dbs1,dbs2,dbs3에 순차적으로저장
예)create table rtable ( col_1 int,cal_2 char(20) )
fragment by round robin indbs1,dbs2,dbs3
extent size 10000 next size3000;
  1. expression 방법 : 조건을 주어 조건에 맞는 space에 저장
예) create table rtable ( col_1 int,cal_2 char(20) )
fragment by expression
col_1 <=100 and col_1 >=1 indbs1
col_1 <=200 and col_1 > 100 indbs2
remainder in dbs3 ;
  1. hash 방법 : DBMS의 function을 이용해 space에 저장
예) create table rtable ( col_1 int,cal_2 char(20) )
fragment by expression
mod(col_1,3) = 0 in dbs1
mod(col_1,3) = 1 in dbs2
mod(col_1,3) = 2 in dbs3 ;

4.12 인덱스 생성 조건

* 컬럼이 WHERE 절이나 join 조건에 자주 사용되어야 함
* 컬럼이 넓은 범위의 값을 가지고 있어야 함
* 컬럼이 null value를 많이 가지고 있어야 함
* 두 개나 그 이상의 컬럼이 같이 WHERE절이나 join조건에 자주사용되어야 함
* 테이블이 매우 크고, 대부분의 질의결과가 행들중 10~15%만을가져오는 것이 좋음
* 많은 인덱스는 항상 질의속도를 높이지는 않음
* 테이블이 만약 다음과 같은 조건이라면 인덱스를 생성하는 것이 좋지않음
- 테이블이 너무 작음
- 컬럼이 질의에서 조건절에 자주 사용되지 않음
- 대부분의 질의결과가 10~15% 이상의 행들을 결과로 가져옴
- 테이블의 변경이 자주 일어나는 경우

4.13 시스템 권한

비고 : Oracle
권한부여
* 80개 이상의 권한이 있음
* DBA(Database Administrator)는 상위 레벨의 시스템 권한을가짐
- 새로운 사용자 생성 : CREATE USER(다른 사람에게 유저를 생성할 수있는 권한을
줄 수도 있음)
- 사용자 삭제 : DROP USER
- 테이블 삭제 : DROP ANY TABLE(어떤 사람의 테이블도 삭제할 수있음)
- 테이블 백업 : BACKUP ANY TABLE(export utility를 이용하여 어떤사람의 테이블도
백업할 수 있음)
* DBA는 CREATE USER 명령을 통해 사용자를 생성함
예) CREATE USER user_name IDENTIFIED BY password;
ALTER USER user_name IDENTIFIED BY password;
* 사용자를 생성하면 DBA는 GRANT 명령을 실행하여 사용자에게 권한을부여할 수 있음
* 사용자는 다음의 시스템 권한을 가짐
- CREATE SESSION : 시스템에 접속할 수 있도록 함.
- CREATE TABLE : 테이블을 생성할 수 있도록 함
- CREATE SEQUENCE : 시퀀스를 생성할 수 있도록 함
- CREATE VIEW : 뷰를 생성할 수 있도록 함
- CREATE PROCEDURE : 프로시져를 생성할 수 있도록 함
* 구문
GRANT privilege [,privilege,....] TO user_name [, user....];
Role
* Role이란 사용자에게 줄 수 있는 연관있는 권한들을 모아둔 그룹을말함
* role을 사용함으로써 사용자에게 권한을 주고 다시 회수하는 것을쉽게 다룰 수 있음
예) CREATE ROLE role_name; a grantcreate table,create view to man; a grant man to kim
권한 회수
* revoke 명령어를 사용
비고 : Informix
* 별도의 DB유저를 생성하지 않고system 유저를 이용. 따라서 system에 유저를 생성하고 로긴 스크립트(.cshrc , .profile, NT의 글로벌 변수)에 인포믹스 유저의 스크립트를copy하는 것으로 작업 종결.
* DBA는 informix로 login 했을때 부여 되며, 각 유저의 권한을 설정할수 있음.
DBA,RESOURCE,CONNECT 의 권한을 부여할수 있으며, DB level, table level의 DML 작업 권한을 부여 할 수있음.
* 뒤에 자세히 설명
비고 : SQL
* user 관리는 두가지 방법을 제공함
Database에 생성 방법과 system유저를 이용하는 방법
처음 설치 시 user생성 방법을 물어보며, default admin은 sapasswd는없음.

4.14 load, unload

- UNLOAD
UNLOAD TO 파일명 SELECT 문
예)unload to ‘new_cust’ select *from customer where customer_num > 120;
- LOAD
LOAD FROM 파일명 INSERT문
예)load from ‘new_cust’ insert intocustomer;
121|a|b|c|d|
122|aa|bb|cc|dd|


5. 인포믹스의 무결성 기능

5.1. 자료의 무결성 (ISOLATION)


- ISOLATION의 개요
INFORMIX-ONLINE은 shared lock를사용하여 자료를 읽을 때4가지 수준의 격리수준을 제공한다.sharedlock는 다른 프로세스에서 자료를 읽을 수 있으나자료를 갱신할 수는없다.
- ISOLATION의 종류
1) DIRTY READS
2) COMMITED READ
3) CURSOR STABILITY
4) REPEATABLE READ
DB별 default level 이 있음.
NO logging mode DB : DirtyRead,
Logging DB : Committed Read
ANSI DB : Repeatable Read
1) DIRTY READS
프로세스들은 자료를 읽기 전에 lock의존재 여부를 확인하지 않으면 검색시, 사용자는 DIRTY DATA라 불리우는아직 변경이 완료되지 않은 행을 볼 수도 있다. 다음과 같은 경우유용하다
- 테이블이 정적일 경우
- 자료의 정확성보다는 자유로운 자료접근이 중요한 경우
- lock가 해제되기를 기다릴 수 없는경우
2) COMMITTED READS
실제로 행들을 lock하는 것이 아니라lock할 수 있는지 만을 조사한다.
적어도 프로세스가 읽고 있는시점에서는 그 행에 대한 트랜잭션이 완료되었음을 알 수있다.
3) CURSOR STABILITY
커서를 이용하여 읽어 들이는 각 행을shared lock한다. 다음 행을 검색하기 전까지 shared lock는 해제되지않는다.
이 격리 수준에서는 트랜잭션이 완료된행만을 보게 되며현재행을 검색하고 있는 동안에는 다른 프로세스가 그행을 수정할 수 없다.
* 격리 수준을CURSORSTABILITY로설정하고, 커서를 사용하지 않는다면 CURSOR STABILITY 는 COMMITEDREAD와 같이 작동된다.
4) REPEATABLE READS
이 격리 수준은 DB서버에 의해 검색되는모든 행을 shared lock한다. 이 모든 행들은 트랜잭션이 완료되기전까지 해제되지 않는다.
다른 프로세스들은 트랜잭션이 COMMIT되기 전까지 행을 갱신할 수없다.
집계함수를 쓰는 경우에 이 level을사용하게 되며, index가 없는 경우에는 사용하지 않는 것이 좋다.
- 격리 수준의 설정
프로세스 격리 수준을 설정하기 위해데이터베이스는 반드시 로깅을 지정해야 하며 격리 수준을 설정하기위하여 SET ISOLATION구문을 사용한다.
SETISAOLATION TODIRTY READ;
SETISAOLATION TOCOMMITED READ;
SETISAOLATION TOCURSORSTABILITY;
SETISAOLATION TOREPEATABLEREAD;

5.2 Locking

다수의 사용자가 사용하는 시스템에서두개 이상의 프로그램이 동시에 수행될 수 있으며, 이러한 병행 처리시에 locking을 사용하여 다른 사용자들간의 충돌을 방지 할 수있다.
- 데이터베이스 수준의 Locking
DATABASE 데이타베이스명 EXCLUSIVE;
예) database stores_demoexclusive;
여러 테이블에 갱신이 일어날 때데이터베이스 수준의 lock를 사용한다.
데이터베이스의 구조를 변경할 때데이터베이스 수준의 lock를 사용한다.
데이터베이스를 백업받을 때데이터베이스 수준의 lock를 사용한다.
배타적(exclusive)lock를 해제하려면데이터베이스를 close하고 다시 open한다.
- 테이블 수준의 Locking
LOCK TABLE 테이블명 IN { SHARE |EXCLUSIVE } MODE ;
UNLOCK TABLE 테이블명;
SET LOCK MODE TO [ NOT ] WAIT [대기시간 ] ;
예) lock table customer in exclusivemode;
unlock table customer;
set lock mode to wait 20;
Share mode : 다른 사용자들로부터lock된 테이블에 자료를 select만 허용.
Exclusive mode : 다른 사용자들로부터lock된 테이블에 접근을 방지한다.
테이블 내의 대부분의 행에 영향을 주는일괄 처리 작업을 한다면 다른 사용자들과의 충돌을 막기 위해 테이블수준의 lock를 사용한다. 테이블의 구조를 변경하거나 색인을 생성할 때테이블 수준의 lock를 사용한다.
- 페이지,행 수준의 Locking
테이블을 생성할 때테이블의 행들을접근 시 사용하는 lock 모드를 설정한다. Page level lock는 페이지상의 하나의 행이 lock되는 경우에도 페이지 전체를 lock한다.
Row level lock는 요청된 행만lock한다.
테이블 생성시 기본값은 page levellock이다.
* 페이지 수준의 lock는 row level 의lock보다 병행성을 감소시키지만, 보다 적은 자원(시스템에서 허용하는lock 수)을 사용한다.
* 운영 시 lock이 자주 걸린다면table을 row level 로 변경하고 sql에서는 set lock mode to wait을주어 ap가 데이터에 접근할 때 lock 걸려 있으면 waiting하고 있다가lock 풀리면 접근 할 수 있도록 프로그램 하는 것이 좋다. 또한 lock이가급적 빨리 풀릴 수 있도록 sql튜닝을 하는 것이 좋다.
실습(3) - 보완성,무결성

1. items 테이블을 unload한다.
items 테이블의 모든 행을 삭제한다.
items 테이블을 load한다.
각각의 경우 items 테이블을 검색해 보고 생성된 자료 파일도 확인해본다.

2. 두 명의 사용자가 나누어 실습한다.
데이터베이스를 생성한 사용자(DBA)가 다음 각각의 SQL문을 실행할때
다른 사용자는 데이터베이스를 connect해 본다.
SQL 1 > revoke dba from public
revoke resource from public
revoke connect from public

3. DBA가 데이터베이스에 connect권한을 부여한 후
다른 사용자는 다음 SQL문을 실행시켜 본다.
SQL 2 > create index idx_cname on customer(담당자명);
lock table orders in exclusive mode;
unlock table orders;

4. DBA가 데이터베이스에 resource 권한을 부여한 후
다른 사용자는 다음 SQL문을 실행시켜 본다.
SQL 3 > create index idx_cname on customer(담당자명);
lock table orders in exclusive mode;
unlock table orders;

5. 다음 SQL을 실행한 상태에서 다른 사용자가 데이터베이스를 선택해본다.
SQL 4> database user## exclusive;

6. 데이터베이스를 새로 connect하고 다음과 같은 SQL을 실행해본다.

user 1 user 2
drop database user## ;
create database user## with log;
grant connect to public;
begin work;
create table test (a date);
insert into test values (today);
lock table test in exclusive mode;





rollback work;
select * from test;






database user##;
select * from test;
set lock mode to wait 10;
select * from test;
set isolation to dirty read;
select * from test;


6.Informix DBMS SQL 성능 향상 기법

서론

  1. Set Explain 의 출력을 해석하는 방법
  2. Informix Optimizer의 역할
  3. 성능향상을 위한 방법

  • Root Dbspace 에는 최소한의 시스템 정보만 포함할 것
  • UNIX File system 공간을 큰 정렬 파일로 채우면 UNIX 프로세스에서오류가능성
  • 논리LOG를 LONG TRANSACTION으로 채우지 말것 : LOG TRX주의

6.1. OPTIMIZER

  • 주어진 질의를 실행하기 전 가장 좋은 최선의 경로를 찾는 INFORMIX엔진의 한 부분
  • SET EXPLAIN ON : OPTIMIZER가 데이타에 접근하는데 선택한 경로를나타냄
  • SYSTEM CATALOG의 정보를 바탕으로 결정
  1. 질의에 사용되는 테이블의 행수 :systables.nrows
  1. 데이타에 사용되는 페이지수와 색인에 사용되는 페이지수 :systables.npused
  2. Column값의 uniqueness : sysconstraints
  3. 색인존재여부 :sysindexes
  4. 데이타가 색인과 같은 순서 즉, cluster index인지 여부:sysindexes.clust
  5. root node에서 leafnode 까지 색인의 레벨수
  6. 각 column에서 두번째로 큰 값과 두번째로 작은 값. optimizer는 이정보로 값의 범위를 대략적으로 알아낼 수 있슴 : syscolumns.colmin,colmax
위의 정보를 바탕으로 옵티마이저는가능한 모든 경로를 검색하고 각각 비용(디스크 접근, 필요한 CPU자원,네트워크 접근 등)을 추정하여 평가함.
  • 테이블 조인 순서 결정
  • Sequential scan의 수행 여부
  • 임시 테이블의 작성 여부
  • 색인 사용 여부 결정
where절에 필터 조건이 많아지고테이블이 많이 포함되면 결정과정이 더욱 복잡해지고 정확한 통계의중요성도 커짐
  • 통계의 정확도
. 시스템 카달로그 정보는 UPDATESTATISTICS가 실행될 때에만 갱신됨
. 동적인 테이블에 대해서는 자주실행시킬 것
. UPDATE STATISTICS는 데이타베이스전체나 개별 테이블, 테이블의 칼럼,
내장 프로시저에 대하여 실행 할 수있음.
  • 엔진이 최적화를 수행하는 시기
.표준 SQL로 사용될 때마다 질의가최적화됨.
.SQL문이 반복 사용될 경우 PREPARE를사용하여 한번만 최적화 시킴
.STORED PROCEDURE의 경우 PROCEDURE 가만들어지거나
내장 PROCEDURE에 대하여 UPDATESTATISTICS가 실행될 때 SQL이
최적화 됨
  • 질의가 갑자기 느려질 때
프로그램이 SET EXPLAIN ON을 사용하여문제 파악

6.2. 개발 시 고려사항

  • 개발하는 동안 잘 실행되는질의가 실제적용에 들어가면옵티마이저가 완전히 다른 경로를 선택할 수 있슴--> 실제환경의데이타베이스와 비슷한 크기의 시험데이타베이스에서 같은 데이타로질의를 실행
  • 단순 명료한 시스템 설계에 충분한 시간을 갖는다.
  • Optimizer는 항상 최적의 query plan을 세우는 것은 아니다. 따라서optimizer가 좋은 역할을 하도록 factor - hint 기능 사용 ( index,full scan method)를 부여한다.
  • ESQL/C 코딩시 onconfig 파라메터의 FET_BUF_SIZE를 32767로 늘려놓아 커서 fetch 사이즈를 늘려 놓는다.
  • 코딩 시 prepare 구문을 사용하여 SQL을 이용한다.
  • prepare 시점에 SQL문장에 대하여 미리 parsing되고 query plan이생성된다.
  • Execute 시점에는 처리해야 할 값만 넘겨주면 즉시 실행된다.
예) Exec sql prepare ins_p from “insert into customer
( customer_num,fname,lname,company)values(0,?,?,?)”;
Exec SQL execute ins_p using:fname,:lname,:company

6.3. 옵티마이저 제어

  • SET OPTIMIZATION HIGH : 엔진이 모든 엑세스 경로를 검사
  • SET OPTIMIZATION LOW : 초기 단계에서 가능성이 적은 옵션을제거하여 최적화 시간을 줄임.그러나 최적의 경로가 될 수 있는엑세스경로가 초반에 제거되어 버릴 수 있슴
  • Onconfig 환경 파일의 OPTCOMPIND 파라메터 고려
OPTCOMPIND=2 (Default) : INDEX SCAN과 FULL SCAN 비용을 비교하여가장 효율적인 경로를 선택하도록 함
OPTCOMPIND=0 : INDEX사용
OPTCOMPIND=1 : OPTIMIZER가 2로 설정되었을 때처럼 작동.
단REPEATABLE READ가 선택되면 OPTCOMPIND가 0으로 설정되었을 때
처럼 작동
행을 모두 SCAN하면서 읽는 동안 전체테이블을 효과적으로 공유할 수 있슴

6.4. 옵티마이저를 위한 데이타분산

칼럼에서 데이타표본을 채취하여테이블 영역에 관한 정보를 다양한BIN에 저장하는 것으로 이루어짐 : 대형 테이블을 다룰 경우 유용한정보가 됨. 또한 UPDATE STATISTICS명령으로 각 칼럼 분포 정보를 생성할 수 있슴
  • UPDATE STATISTICS HIGH FOR :테이블의 모든 행 평가. 느린 대신정확함
  • UPDATE STATISTICS MEDIUM FOR :데이타 표본만 추출하여 실행
  • UPDATE STATISTICS LOW FOR : 데이타 분포 정보를 얻지 않음

6.5. UPDATE STATISTICS 실행 계획

  1. UPDATE STATISTICS문을 모든 테이블에 실행
  2. 복합 색인의 첫번째 칼럼이나 질의의 한 부분으로 사용된 모든칼럼에는 UPDATE STATISTICS HIGH문을 실행하거나 테이블이 클 경우에는update statistics medium resolution 0.0598;을 실행한다.
  3. 복합 색인의 첫번째 칼럼이 아닌 모든 칼럼에 대해서 UPDATESTATISTICS LOW를 실행
  4. UPDATE STATISTICS단계를 완료하면 DBSCHEMA UTILITY의 다음OPTION을 사용하여 데이타분포정보를 확인 할 수 있슴
예) dbschema -d databasename-hdtablename
  1. 위의 내용은 fragmentation 전략에 유용하게 사용할 수 있슴
  2. 대형 정적 테이블에 대해서는 UPDATE STATISTICS를 재실행할 필요가없슴

6.6. SQL 질의 품질보증과 최적화

  1. 큰 테이블에서는 순차적 검색을 하지 않는 것이 좋음
  2. 임시 정렬FILE이 크게 생성되도록 하는 질의는 사용하지 말 것
  3. Correlated Subquery를 사용
  4. 서로 다른 칼럼에서 사용된 OR문은 옵티마이저의 색인 사용을방해하므로 색인이 있고 질의 계획에서 옵티마이저가 순차스캔을선택하면 UNION문의 사용을 고려할 것
  5. 질의 초기에 가능하면 많은 행을 제거할 것
UPDATE STATISTICS HIGH 를 사용하면 옵티마이저에 데이타분포에 대한정보
가 추가로 제공되므로 알맞은 테이블이 먼저 제거됨. INDEX SCAN이항상최선
의 방법은 아님
  1. 자료형을 변환하고 문자 칼럼을 비교하는 것. 가능하면 칼럼의자료형을 숫자형으로 바꿀 것. 조인 칼럼이 문자형이면 매 행마다 한바이트씩 비교함.
  2. OR, LIKE, MATCH, 함수(MONTH, DAY, LENGTH등), 부정표현(!=’NOUN’), 첫 문자를 제외한 하위 열 검색(POSTCODE[4,5] >10)등은 INDEX를 사용하지 못함
  3. LOGGING된 데이타베이스에서 LONG TRANSACTION을 실행하지 말것,LONG TRANSACTION은 논리로그를 채워 데이타베이스를 손상시킬 위험이있슴
LOCK을 지나치게 많이 사용하는 것을막으려면 테이블을 EXCLUSIVE MODE로 LOCK할 것. LOCK을 지나치게사용하면 성능이 저하되고 또한 LOCK의 최대수에 도달하면 명령문이실행되지 않음
  1. 필요한 칼럼만 선택할 것. FRONT END와 BACK END간의 통신이 줄고I/O도 줄어듬. 가능한 한 “SELECT *” 은 사용하지 말 것.
  2. 데이타의 일정부분 집합이 WHERE 술어로 다시 선택되면 임시테이블을 사용할 것. 검색하고자 하는 테이블이 매우 클 경우 모든테이블을 임시 테이블로 선택하고 임시 테이블에서 재검색을 할것.
  3. 옵티마이저가 가장 좋은 경로를 선택하도록 임시 테이블을 사용함.큰 테이블에서 임시 테이블로 행을 선택하고 임시 테이블을 나머지테이블에 조인하면 됨
  4. 임시 테이블에 색인 사용
  5. 임시 테이블에 UPDATE STATISTICS사용
  6. 임시 테이블을 만들 경우 WITH NO LOG를 사용. 논리 로그에 쓰는오버헤드가 없어지므로 성능이 향상됨. 임시 테이블에 LONGTRANSACTION을 만들 가능성이 없어짐
Posted by 달나라임금

댓글을 달아 주세요

2009.03.12 14:31

mysql서버는 리눅스서버로 하고 외부에서 odbc로 연동하여 접속할때
아래와 같은 오류가 나올때 해결방법
 
"Lost connection to MySQL server during query"
 
[해결방법]
mysql]# cd /etc 
my.cnf 화일에 skip-name-resolve 추가하세요
 
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
default-character-set=euc_kr
skip-name-resolve <----추가부분입니다.
 
[mysql.server]
user=mysql
basedir=/var/lib
language=korean
default-character-set=euc_kr
 
[safe_mysqld]
err-log=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
 
[mysql.client]
default-character-set=euc_kr
Posted by 달나라임금

댓글을 달아 주세요

2009.03.02 17:55
struct sigaction act;
act.sa_handler = SigHandler;
act.sa_flags = 0;
sigemptyset( &act.sa_mask );
sigaction( SIGCHLD, &act, NULL );

void SigHandler( int signo )
{
    pid_t pid;
    while ((pid = waitpid(-1, 0, WNOHANG)) > 0);
    return;
}
Posted by 달나라임금

댓글을 달아 주세요

2009.03.02 09:28
시간이 걸리는 프로그램을 백그라운드에서 실행


시간이 걸리는 처리(대량 메일 송신이나 데이터 베이스 전체 삭제등)를
브라우저에서 실향하고 싶을 때나 필요성이 있을 겁니다. 그럴 경우에
일반적인 방법으로 처리하면 이 처리가 종료될 때까지 유저가 브라우저를
사용할 수 없게 됩니다(IE 의 지구마크가 계속 돌아가는 상태).
이 때에는 유저가 브라우저에 대하여 어떤 조작을 하였을 경우의 작동에
대해서 보장이 되지 않습니다. 또, 일정한 시간이 경과하면 접속(런)
타임아웃이 되는 경우가 있습니다.

이러한 상태를 피하기 위해 브라우저를 바로 풀어주고 시간이 걸리는
처리는 백그라운드에서 처리(뒷구멍에서 호박씨까기 상태)해주는 방법이
필요하게 됩니다. 주로 대량 메일을 송신하는 경우에 많이 사용되리라고
생각됩니다.

Perl 에서는 fork 함수를 사용해서 같은 프로그램안에 백그라운드에서
처리할 부분을 기술할 수 있지만 PHP 의 경우에는 fork 함수가 없으므로
백그라운드처리하게 할때 먼저 별도의 프로그램을 만들어 놓고, system
함수 혹은 exec 함수를 불러내는 형식이 됩니다. 당연한 이야기 이지만
백그라운드에서 처리된 결과를 얻는 것은 불가능합니다(메인 처리는
백그라운드 처리 전에 먼저 종료 되었기 때문에). 그래서 결과적으로
exec 를 사용해도 system 을 사용해도 똑 같은 결과가 됩니다.

system 함수나 exec 함수의 리퍼런스를 보면 다음과 같은 내용이 있습니다.

(이 함수를 사용하여 프로그램실행을 해서 백그라운드에서 실행한 상태로
두고 싶을 때에는 프로그램의 출력을 파일 혹은 다른 출력 스트림에
리다이렉트해줄 필요가 있는 점에도 추의해야 됩니다. 그렇지 않으면
PHP는 그 프로그램의 실행이 종료될 때까지 풀어주지 않고 붙들고 있을
것입니다(Hang).)

이 문장의 의미는 다음과 같이 기술하라는 의미입니다.

system("/home/your/bgprog $arg1 $arg2 > /dev/null &");

여기에서 bgprog 은 백그라운드에서 실행하고자 하는 프로그램입니다.
어떤 언어로 기술되어도 상관이 없습니다. 혹은 위의 예와 같이 메인
처리에서 인수를 건네 주고 싶은 경우에는 bgprog 쪽에서 정확하게 받아
처리할 수 있도록 해주지 않으면 안됩니다.

[> /dev/null] 가 [리다이렉트] 에 해당하는 기술입니다. /dev/null
라고 하는 것은 [쓰레기통] 으로 생각하면 됩니다. 모든 출력결과를
버립니다. 마지막의 & 는 백그라운드에서 실행을 하라는 의미입니다.
이 주변의 자세한 내용은 UNIX 쉘 관련 참고서를 보면 있습니다.
[PHP는 그 프로그램이 종료 될때까지 Hang됩니다] 라는 의미는 IE 의
지구 마크가 게속 돌고 있는 상태를 의미합니다.

그럼 실험을 해보겠습니다. 브라우저의 상태에 주의해서 봅시다.
bgprog 에 해당하는 프로그램을 다음과 같은 내용으로 만들어 보겠습니다.
간단히 수면제 멱여서 10 초동안 잠재우는 프로그램입니다.
여기에서는 쉘스크립으로 만들겠습니다.

sleep.sh

sleep 10

다음은 위의 프로그램을 불러낼 PHP 스크립을 만들겠습니다.

<?
  system("/bin/sh /home/your/sleep.sh > /dev/null &");
  echo "OK.";
?>

위의 페이지를 출력하면 순간적으로 OK 가 출력이 됩니다.
10초 이내에 ps 코맨드를 확인하면 OK가 출력이 된후에도
sleep.sh 가 실행이 되고 있는 상태가 됩니다.

그럼 아래와 같이 일반적인 방법으로 변경하면 어떻게 될까요?

<?
  system("/bin/sh /home/your/sleep.sh &");
  echo "OK.";
?> 
  
10초가 지난 후에 OK가 출력이 될 것입니다.
그 동안에 브라우저는 목빠지게 처리 결과를 기다리고 있는
상태로 있다는 것을 확인 할 수 있을 겁니다.

Posted by 달나라임금

댓글을 달아 주세요

2009.01.12 17:56

내맘대로 정의한 Win 32 API 함수

SendMessage()
 - 메시지 루프를 거치지 않고
   메시지를 윈도우 프로시져로 바로 보낸다

PostMessage()
 - 메시지 루프로 메시지를 보낸다

GetKeyState()
 - 인자로 주어진 가상 키 코드 값에 해당하는 키가 눌린 상태인
   지 안눌린 상태인지 판단한다.
   리턴값은 SHORT형(2바이트). 상위 비트가 true이면 눌린상태
   하위비트가 true이면 그렇지 않은 상태이다.

CClientDC dc;
 -현재 객체의 DC

GetStyle()
 - 현재 윈도우의 속성을 구하는 함수

SetWindowLong()
 - 윈도우 스타일이나 프로시저를 재정의 하는 함수.
 - GWL_STYLE : 새로운 윈도우 스타일을 정의
 - GWL_WNDPROC : 새로운 프로시저를 정의.

ZeroMemory()
 - memset과 비슷한 함수

SetWindowPos()
 - 윈도우의 위치 변경

GetCursorPos()
 - 마우스 커서의 위치 구하는 함수
 - 스크린 기준 좌표

GetParent()
 - 부모 핸들 구하기

SetCaputre()
 - 마우스를 놓치지 않기 위해 캡쳐

AfxGetMainWnd()
 -메인프레임의 핸들을 구하는 함수

pCmdUI->Enable()
 -인자가 참을 반환하면 해당 커맨드를 사용할 수 없게 한다.

pCmdUI->SetText()
 -해당 커맨드의 이름을 변경하는 함수.

pCmdUI->SetCheck()
 -해당 메뉴의 이름 앞에 체크 표시를 해주는 함수

GetMenu()->GetSubmenu()
 -메뉴의 객체를 리턴한다.

메뉴객체->AppendMenu()
 -메뉴를 만든다.

메뉴객체->DeleteMenu()
 -메뉴를 제거한다.

툴바객체.CreateEx()
 -툴바를 생성 하는 함수

툴바객체.LoadToolBar()
 -생성된 툴바에 미리 정의된 리소스를 가져오는함수

상태바객체.SetPaneInfo()
 -상태바의 속성을 설정

상태바객체.SetPaneText()
 -상태바의 텍스트 설정

CSDI_SequenceApp()
 -응용 프로그램 객체 생성자

CSDI_SequenceApp()::InitInstance()
 - 응용 프로그램의 초기화 부분
 - 프로그램의 중복 실행 방지
 - 트라이얼 버전의 기간 검사 루틴
 - 프로그램 사용자 인증 부분(ex.관리자만 실행할수있도록..등)
 - 프로그램 실행시 인자로 전달되는 매개 변수 처리

AddDocTemplate()
-도큐먼트 템플릿 객체 생성자

ProcessShellCommand()
-오피스 문서를 실행시켰을때 오피스가 실행되는 등의 로드

CMainFrame::PreCreateWindow()
-윈도우의 크기나 메뉴 생성 여부 등을 설정하는 곳

CSDI_SequenceApp:Run()
- ::PeekMessage()함수를 호출하는 부분.
- API의 클래스 설정 부분과 비슷

다이얼로그 관련 함수
OnInitDialog()
 - 다이얼로그의 메시지 함수이다.
 - 다이얼로그가 처음 생성될때 호출되는 함수이다.
DoModal()
 - 생성한 다이얼로그의 멤버 함수
 - 모달 대화상자를 생성하는 함수이다.
CDialog::OnOK()
 - 어떤 버튼의 함수에서든 이 함수를 호출시키면
   OK버튼과 같아지게 된다.
 
컨트롤 윈도우 관련 함수
            스태틱
GetDlgItem()
 - 스태틱 컨트롤 윈도우의 ID값을 매개변수로 가지며 CWnd 포인터를 반환한다.
 - CStatic* 로 타입 캐스트 한 후에 사용해야 한다.
            에디트
GetLength()
 - 에디트 컨트롤 위자드의 CString 객체내의 멤버 함수
 - 해당 에디트 컨트롤에 입력된 텍스트의 길이를 반환한다.
SetFocus()
 - 에디트 컨트롤 위자드의 CEdit 객체내의 멤버 함수
 - 호출되면 입력 포커스를 해당 에디트 컨트롤로 이동한다.
            스핀
SetRange()
 - Spin 객체의 멤버함수이다.
 - 인자로 최소값, 최대값을 가진다.
 - 숫자 범위를 설정한다.
            리스트&콤보
InsertString()
 - 리스트 박스의 컨트롤 멤버 객체의 함수
 - 인덱스를 주고, 각 번호에 문자열을 입력한다
AddString()
 - 인덱스와 상관없이 마지막에 문자열 추가
 ? 인덱스에 적용 되는가 확인
GetCount()
 - 리스트 박스의 컨트롤 멤버 객체의 함수
 - 현재 인덱스를 반환한다.
GetCurSel()
 - 리스트 박스의 컨트롤 멤버 객체의 함수
 - 리스트 박스에서 현재 선택된 문자열의 인덱스를 반환한다.
GetText()
 - 리스트 박스의 컨트롤 멤버 객체의 함수
 - 두개의 인자를 가지며 첫번째 인자에는 인덱스를 넣고
   두번째 인자에는 해당 인덱스의 문자열을 복사할
   문자열 변수를 지정한다.(CString 타입)
FindString()
 - 리스트 박스의 컨트롤 멤버 객체의 함수
 - 해당 문자열로 시작하는 문자열을 리스트 박스 내에서 찾아주는 함수
 - 인덱스 시작지점과 비교 문자열을 인자로 가진다.
 - 반환값은 찾은 문자열의 인덱스 번호
GetLBText()
 - 콤보 박스의 컨트롤 멤버 객체 함수
 - 리스트 박스의 GetText()함수와 같다.
                    프로그래스바, 슬라이더 컨트롤
Setpos(), Getpos()
 - 슬라이더컨트롤, 프로그래스 바의 객체 멤버 함수.
 - 위치 변경을 하는 함수.
                    리스트 컨트롤 관련 함수
Create
 - CImageList의 멤버 함수.
 - 리소스에 추가되어있는 이미지의 ID와, 이미지의 자르는 크기와 분할 갯수
   그리고 컬러키를 인자로 받는다.
 - 해당 객체 안에 이미지를 잘라서 추가한다.
SetImageList
 - CListCtrl 객체의 멤버 함수
 - 미리 지정된 이미지객체와 이미지 타입을 인자로 가지며
   정의된 이미지 정보를 리스트 컨트롤 객체에 전달한다.
InsertItem
 - CListCtrl 객체의 멤버 함수
 - 아이템(탐색기의 폴더)를 추가한다.
 - 인덱스와 아이템 이름, 이미지 숫자를 인자로 가진다.
ModifyStyle
 - CListCtrl 객체의 멤버 함수
 - 리스트 컨트롤 내의 스타일 변경한다.
 - LVS_ICON, LVS_REPORT, LVS_SMALLICON, LVS_LIST 등을 플래그 인자로 가진다.
InsertColumn
 - CListCtrl 객체의 멤버 함수
 - LVS_REPORT 스타일에서 보여질 컬럼을 추가한다.

메시지 함수
OnInitialUpdate()
 - SDI, MDI 등 Document/View구조의 프로그램에서 새로운 문서가 열릴 때 호출되는 함수.

디버깅 매크로 함수
ASSERT()
 - 인자가 거짓이면 프로그램이 동작하지 않는다.
TRACE0()
 - 디버깅에서 사용하는 매크로 함수.
 - printf처럼 출력을 하는데 실제 프로그램에선 보이지 않고
   디버깅모드에서 아웃풋 인터페이스에서만 확인할수있다.
OutPutDebugString()
 -릴리즈 모드에서도 허용되는 디버그 매크로
GetLastError() 
 - 현재 진행중인 쓰레드에서 발생한 제일 마지막 에러값을 리턴


메인 프레임 함수
GetActiveView()
 - 프레임 윈도우의 멤버 함수이다.
 - 현재 활성화된 클라이언트 뷰의 포인터를 리턴한다.
 - 클라이언트 뷰의 객체로써 사용하려면 캐스트 해주어야 한다.
PostNcDestroy()
 - CWnd 객체의 멤버 함수
 - 윈도우가 스스로를 파괴하기 전에 호출한다.

기타 함수
DoDataExchange()
 - UpdateData() 함수가 호출되면 호출되는 함수이며 UpdataData의 인자에 따라 ,
   정해진 두개의 값을 교환한다.
UpdataData()
 - TRUE, FALSE 두개의 인자를 가진다.
 - 컨트롤 윈도우와 연동되는 변수를 제어할때 사용한다.
 - TRUE값을 줬을땐 스태틱 컨트롤 윈도우의 텍스트 값을 해당 변수로 가져오고
 - FALSE값을 인자로 주었을땐 변수의 값을 윈도우의 텍스트에 반영 한다.

다른 클래스에 접근하기
GetActiveView()
 - 프레임 윈도우에서 클라이언트 뷰의 객체 참조
AfxGetMainWnd()
 - 클라이언트뷰나 도큐먼트 객체에서 메인 프레임의 핸들 구하기
GetDocument()
 - 클라이언트뷰에서 도큐먼트 객체 참조
m_viewList.GetHead()
 - 도큐먼트 객체에서 클라이언트 뷰 참조
DC관련 함수
FrameRgn()
 - CDC 객체의 멤버 함수
 - 지정된 영역의 테두리 선을 긋는 함수
FillRgn()
 - CDC 객체의 멤버 함수
 - 지정된 영역 내의 공간을 지정된 색으로 채우는 함수
SelectClipRgn()
 - CDC 객체의 멤버 함수
 - 설정된 리젼 외에 다른 부분을 잘라내는 함수 
ShowWindowRgn()
 - 프레임 윈도우의 멤버 함수
 - 지정된 리젼만 보이도록 한다.
PtInRect()
 - CRect 객체의 멤버 함수
 - CPoint를 인자로 가지며 인자로 받은 CPoint의 위치가 지정된 영역과 일치하지 않으면 FALSE반환
GetSysColor()
 - 윈도우의 색을 가져오는 함수.

Posted by 달나라임금

댓글을 달아 주세요