바쁜 일정으로 글 하나 올리가가 힘이드네요 (풋 핑계)

누가 말했나요 팀장이 구만둬야 팀장이 될수 있다고 ... 제가 그런꼴이네요 팀원도 없는 팀의 팀장 자리를 딱 차고 있습니다.

오늘은 crontab 요녀석 잘 만쓰면 정말 유용합니다잉.  요녀석 한번 파헤쳐 보겠습니다. 잉~


1. crontab 은 무엇인가?

유닉스계열의 시스템에서 batch job을 돌릴때 사용한다. 어떤 작업을 하는 shell script 작성한 후에 crontab에 일정을 등록하면 정해진 시간에 자동으로 실행한다. 라고 말을 많이 합니다.
쉽게 말하면 타이머 맞춰놓고 script 실행하는 명령어 입니다.

2. 현재 crontab에 등록된 리스트 보기

# crontab -l       현재사용하고 있는 crontab 파일 출력
# crontab -l
0 4 * * * /cron_service/cron.sh

3. chrontab 등록/수정

# crontab -e       crontab 파일의 수정(edit)
# crontab -e
0 4 * * * /cron_service/cron.sh

4. chrontab 작성

# crontab -e 들어가신 후
내용에 맞게 수정 또는 추가 하신 후 저장하시면 됩니다.
# crontab -e
  * * * * * /cron_service/cron.sh

*cronjob은 공백이나 탭키로 분리되는 6개의 필드(*)가 있습니다

1번필드 : 시간(분)
2번필드 : 시간(시간)
3번필드 : 일자
4번필드 : 월
5번필드 : 요일(0:일요일, 1:월요일, 2:화요일….)
6번필드 : 실행할 명령이나 스크립트
(5번필드 이후의 모든 문자는 공백이나 탭키와 상관없이 모두 6번필드로 인식함)

*cron table의 각 필드
| 분 | 시간 | 날짜 | 달 | 요일 | 사용자 | 명령 |

minute(0~59) hour(0-23) day(1-31) month(1-12) weekday(1-7) command
<분>은 0-59  <시>는 0-23  <날짜>는 0-31  <달>은 0-12(0또는 12는 12월, 1은 1월...) <요일>은 0-7(0과 7은 일요일, 1은 월요일...)
''*''  :  everytime
''-''  :  범위 지정, 예를 들어 시간 필드에 1-3이면 1시와 3시 사이
'',''  :  separator, 예를 들어 시간 필드에 1,3이면 1시와 3시
/   :  시간필드 에서 23-7/2라면 23시부터 07시까지 매 2시간마다라는 의미
      분필드에서 */2라면 매 2분마다라고 해석하면 된다.

5. crontab예제

예제 1) 매월 매일 모든요일 06:00시에 /usr/local/bin/test.sh를 실행
  00 06 * * 0-6 /usr/local/bin/test.sh >> /dev/null

예제 2) 1분간격으로 /usr/local/bin/test.sh를 실행
  * * * * * /usr/local/bin/test.sh >> /dev/nulll

예제 3) 10분간격으로 /usr/local/bin/test.sh를 실행
  */10 * * * * /usr/local/bin/test.sh >> /logs/test.log

예제 4) 매주 월요일 오전 05시 30분에 ~/bin/backup.sh을 실행
  30  05 *  *  1    ~/bin/backup.sh

예제 5)  매월 1일 새벽 2시 30분에 ~/bin/backup.sh를 실행
  30  2  1  *  *    ~/bin/backup.sh

예제 6)  매일 새벽 01시 20분에 3일간 접근하지 않은 /tmp내의 파일을 삭제
  20  1  *  *  *    find /tmp -atime +3 -exec rm -f () '';''



6. cron table을 삭제

# crontab -r : 현제 cron table을 삭제 하니 조심하시요 ^^!!



이로써 crontab 정복 하셨습니다.

crontab을 정복하신 당신은 개발자임다 잉~~

열심히 테스트 하고 연마하셔서 진짜 개발자가 되시기 바랍니다.

다음 시간에 봐요 ~~~

설정

트랙백

댓글

  • 2013.11.13 10:29 답글 | 수정/삭제 | ADDR

    비밀댓글입니다

개발을 하고 서버를 관리 하다보면 복잡한 일들이 많습니다.
로그를 지운 다던가? 백업을 한다던가 ? 그밖에 일들 수작업이나 프로그램을 돌리기에 애매한 작업들 있죠잉.

그래도
쉘스크립트 못쓴다고
누가 뭘라고 안해요잉.
경찰출동 안해요잉.
여친이 헤어지자고 안해요잉.

하지만
조금 편하게 작업 할수 있다는거
저도 개발 오래 해왔지만 이거 참 쉘스크립트 안쓰고도 여태 잘 보티고 있습니다.
그래도 이런게 있다 정도는 알고 넘어 가면 참 좋겠죠. 오늘도 다른 분들이 잘 정리 놓은걸 찾아서
요리 고치고 조리 고치고 해서 한번 만들어 봤습니다.  경찰 출동 시키지 마세요 .

서론이 길었습니다.

오늘늘 참 쉬운 하지만 리눅스 기초는 띄고 오셔야 하는
기초 쉘 스크립트 입니다.
1. 쉘 스크립트                            

간단한 쉘 스크립트

$ vi hello.sh

(hello.sh)
#!/bin/bash
echo hello world

$ chmod 755 hello.sh

$ ./hello.sh
hello world


- #! 은 쉘에게 이 프로그램을 실행하기 위해서 #! 다음에 오는 아규먼트를 실행프로그램으로
사용한다는 것을 알려주기 위해서 사용된다.

- Unix/Linux system은 Windows와 달리 파일의 확장자명(.exe .com 등)으로 실행파일 유무를
결정하지 않으며, 파일권한 설정의 변경을 통하여 실행파일로 결정한다. 따라서 스크립트
파일을 실행하기 위해서는 파일에 실행권한을 주어야 한다.

2. 주석                                     

 - "#" 에서부터 라인의 마지막까지가 주석으로 처리된다.#!/bin/bash
# 만든이 : comp-ta
# 하는일 : hello world 를 출력한다.
echo "hello world" # 문자열을 출력한다.

3. 변수                                     

- C 언어와 같은 변수 선언을 필요로 하지 않는다.
- 기본적으로 데이터를 string(문자열)로 저장한다.(수치를 대입해도 실제 수치가 아닌
문자열이 저장된다.) 따라서 타입이 없고 아무 값이나 저장할 수 있다.
- 변수의 값을 사용할 때는 변수명앞에 "$"를 붙여서 사용하고, 값을 대입할때는 "$"를 붙이지
않는다.
- 변수에 데이타를 저장하기 위해서는 대입연산자 "=" 를 사용한다. 대입연산자와,
피연산자/연산자 사이에는 공백이 존재하면 안 된다.
varname=value

- 산술연산 : 모든 것이 문자열로 저장되기 때문에 산술연산을 하기 위해서는 변수=$((산술식))
과 같이 사용.
a=1
b=2
c=$(($a+$b))
echo $c
(3 출력)

4. 명령행 인자(argument)             

  - $1~ $n - 넘겨진 인자들
  - $* : 스크립트에 전달된 인자들을 모아놓은 문자열. 하나의 변수에 저장되며 IFS 환경변수의
     첫번째 문자로 구분된다. (IFS : internal field separator)
  - $@ : $*과 같다. 다만 구분자가 IFS변수의 영향을 받지 않는다.
  - $0 : 실행된 쉘 스크립트 이름
  - $# : 스크립트에 넘겨진 인자의 갯수

(test1.sh)
#!/bin/bash
echo "This Script Executable File : $0"
echo "Argument Count : $#"
echo "Argument List \$* : $*"
echo "Argument List \$@ : $@"
echo "Argument 1 : $1"
echo "Argument 2 : $2"
echo "Argument 3 : $3"
echo "Argument 4 : $4"

(실행)
$chmod 755 test1.sh
$./test1.sh a1 a2 a3 a4
This Script Executable File : ./test1.sh
Argument Count : 4
Argument List $* : a1 a2 a3 a4
Argument List $@ : a1 a2 a3 a4
Argument 1 : a1
Argument 2 : a2
Argument 3 : a3
Argument 4 : a4

5. 제어구조                                

1. [ if / else ]
- 조건을 test하여 참이면 then부분을, 거짓이면 else부분을 실행.
- test 조건들은 "[ ]" 사이에 쓰면된다. "[" 과 "]" 사이에는 반드시 공백문자가 들어가야 한다.
- 변수 값, 파일 특징, 명령의 실행 여부 등 다양한 test 조건이 있다.
 Syntax  Example
  if [condition]
  then
    statements
  elif [condition]
  then
    statements...
  else
    statements
  fi
  if [ $1 -lt $2 ]
  then
    echo $1 is less than $2
  elif [ $1 -gt $2 ]
  then
    echo $1 is greater than $2
  else
    echo $1 equals to $2
  fi

- 참고 : test 명령 조건
 문자열비교
  [ string ] - string이 빈 문자열이 아니라면 참
  [ string1 = string2 ] - 두 문자열이 같다면 참
  [ string1 != string2 ] - 두 문자열이 다르면 참
  [ -n string ] - 문자열이 null(빈 문자열) 이 아니라면 참
  [ -z string ] - 문자열이 null(빈 문자열) 이라면 참
 산술비교
  [ expr1 -eq expr2 ] - 두 표현식 값이 같다면 참 ('EQual')
  [ expr1 -ne expr2 ] - 두 표현식 값이 같지 않다면 참 ('Not Equal')
  [ expr1 -gt expr2 ] - expr1 > expr2 이면 참 ('Greater Than')
  [ expr1 -ge expr2 ] - expr1 >= expr2 이면 참 ('Greater Equal')
  [ expr1 -lt expr2 ] - expr1 < expr2 이면 참 ('Less Than')
  [ expr1 -le expr2 ] - expr1 <= expr2 이면 참 ('Less Equal')
  [ ! expr ] - expr 이 참이면 거짓, 거짓이면 참
  [ expr1 -a expr2 ] - expr1 AND expr2 의 결과 (둘다 참이면 참, 'And')
  [ expr1 -o expr2 ] - expr1 OR expr2 의 결과 (둘중 하나만 참이면 참, 'Or')
 파일조건
  [ -b FILE ] - FILE 이 블럭 디바이스 이면 참
  [ -c FILE ] - FILE 이 문자 디바이스 이면 참.
  [ -d FILE ] - FILE 이 디렉토리이면 참
  [ -e FILE ] - FILE 이 존재하면 참
  [ -f FILE ] - FILE 이 존재하고 정규파일이면 참
  [ -g FILE ] - FILE 이 set-group-id 파일이면 참
  [ -h FILE ] - FILE 이 심볼릭 링크이면 참
  [ -L FILE ] - FILE 이 심볼릭 링크이면 참
  [ -k FILE ] - FILE 이 Sticky bit 가 셋팅되어 있으면 참
  [ -p FILE ] - True if file is a named pipe.
  [ -r FILE ] - 현재 사용자가 읽을 수 있는 파일이면 참
  [ -s FILE ] - 파일이 비어있지 않으면 참
  [ -S FILE ] - 소켓 디바이스이면 참
  [ -t FD ] - FD 가 열려진 터미널이면 참
  [ -u FILE ] - FILE 이 set-user-id 파일이면 참
  [ -w FILE ] - 현재 사용자가 쓸 수 있는 파일(writable file) 이면 참
  [ -x FILE ] - 현재사용자가 실행할 수 있는 파일(Executable file) 이면 참
  [ -O FILE ] - FILE 의 소유자가 현재 사용자이면 참
  [ -G FILE ] - FILE 의 그룹이 현재 사용자의 그룹과 같으면 참
  [ FILE1 -nt FILE2 ] - : FILE1이 FILE2 보다 새로운 파일이면 ( 최근파일이면 ) 참
  [ FILE1 -ot FILE2 ] - : FILE1이 FILE2 보다 오래된 파일이면 참
  [ FILE1 -ef FILE2 ] - : FILE1 이 FILE2의 하드링크 파일이면 참


2. for
 - 지정된 범위 안에서 루프를 수행한다. 범위는 어떤 집합도 가능하다.
 - (Bash 2.03버전 이후 버전) C style의 for loop 사용가능
    = 아래 3 문장은 모두 같은 의미이다 =
    for a in 1 2 3 4 5 6 7 8 9 10
    for a in $(seq 1 10)
    for ((a=0;a<10;a++))
 - 범위가 하나의 string이라면 IFS를 이용해 구분가능.
 - [in list]를 생략한다면 기본값은 “$@”

 Syntax  Example
for name [in list]
do
   statements that can use
  $name.
done
IFS=:
for
dir in $PATH
do
   ls –ld $dir
done



3. while
 - 어떤 조건이 참인 동안 코드를 반복
 Syntax  Example
while condition
do
   
statements...
done
count=0
while [ $count -lt 10 ]
do
    echo $count
     count=$(($count+1))
done
4. until
 - 어떤 조건이 참일 때까지 (거짓인 동안) 반복
 Syntax  Example
until condition
do
statements...
done
count=0
until [
$count -gt 10 ]
do
  
echo $count
    count=$(($count+1))
done


5. case
 - C의 switch구문과 비슷한 역할을 함
 - C의 switch 구문은 정수나 문자 같은 단순한 값을 검사하는 반면, Bash의 case는
 - 와일드카드 (?, *) 사용이 허락되는 어떤 패턴을 놓고 문자열을 검사
 Syntax  Example
case expression in
  pattern1 )
    statements ;;
  pattern2 )
    statements ;;
  ...
esac
case $1 in
   *.jpg )
      echo jpg: Graphic
   File!! ;;
   *.txt )
      echo txt: Text File!! ;;
   * )
      echo Unknown File!! ;;
esac

6. select
 - Korn Shell, Bash Shell에만 존재
 - 간단한 메뉴를 제공
 - select의 루프 내에서는 자동적으로 루프를 벗어날 수 없기 때문에 반드시 break문등을
   사용해서 루프를 벗어나야 한다.
 - prompt string을 변경하기 위해서는 쉘변수 PS3를 이용.
 Syntax  Example
select name [in list];
do
   statements that can use   $name...
...
done
#!/bin/bash
echo "다음 중 scripting language 에 속하는 것은?"
PS3=”숫자를 선택하세요 : “
select var in "Bash script" "C/C++ "Java” "Exit"
do
if [ "$var" = "Bash script" ]
then
   echo "정답입니다."
   break
elif [ "$var" = "Exit" ]
then
   echo "종료합니다."
   exit 1
else
   echo "$var 을 선택하셨습니다. 오답입니다."
   echo "다음 중 scripting language 에 속하는 것은?"
fi
cf.) read : 직접 사용자 입력을 받음.

#!/bin/bash
echo “이름을 입력해주세요 : “
read NAME
echo "Hi $NAME!"



6. Quoting                                

* Single Quotes
    - Single Quotes 안의 모든 특수 문자를 보통 문자로 취급
    - Single Quotes 안에 또 다른 Single Quote를 쓸 수 없음

$ echo 2 * 3 > 5 is a valid inequality. ………(X)
$ echo '2 * 3 > 5 is a valid inequality.’ ………(O)
$ echo Hatter's tea party ………(X)
$ echo Hatter\'s tea party ………(O)
$ echo 'Hatter'\''s tea party' ………(O)

* Double Quotes
 - Weak Single Quotes
 - Single Quotes와 달리 $, `(backquote), ₩(이스케이프)는 처리
 - 문자열 안에서 다음을 참조할 때 사용
    - 변수확장 : $varname
    - 명령 : $(command) 혹은 `command` -single quote가 아니라 backquote임.
    - 산술연산구문 : $((1+1))

$ echo "2 * 3 > 5 is a valid inequality."
$ echo "Hatter\'s tea party"

$ echo "path=$PATH"
$ echo "current directory=$(pwd)"
$ echo "current directory=`pwd`"
$ echo "1 + 1 = $((1+1))"


7. 함수                                     

 - 다른 프로그램 언어에서와 같이 코드를 재사용하거나 모듈화를 위해 함수를 사용
 - 함수는 함수가 불리기 전에 정의되어야 한다. (C처럼 함수를 미리 선언하는 방법은 없음)
 - parameter : 함수는 자신에게 넘어온 인자를 $1, $2와 같이 인자의 위치로 참조한다.
 - return value : 함수는 반드시 정수값만 리턴할 수 있다. 이 리턴값은 $? 변수에 저장된다.

#!/bin/bash

add()
{

  result=$(($1+$2))

  return $result
}
a=3
b=5
add $a $b
sum=$?

echo "$a + $b = $sum"


8. Backup script code                 

#!/bin/bash
if [ -z $1 ]||[ -z $2 ]; then
  echo usage: $0 source_dir target_dir
else
  SRC_DIR=$1
  DST_DIR=$2
  OF=output.$(date +%y%m%d%H%M%S).tar.gz
  if [ -d $DST_DIR ]; then
    tar -cvzf $DST_DIR/$OF $SRC_DIR
  else
   mkdir $DST_DIR
   tar -cvzf $DST_DIR/$OF $SRC_DIR
  fi
fi

휴~~~~~~ 누가 쉽다고 했어 너야! 너야! 너야! 생각 보다 쉽지는 않아요.

하지만 이정도 알아두면 나도 shell script 아는데~ 아는건데~ 아는걸꺼야~ 정도는 될꺼 같은데요 .
난 좀더 응용을 하고 싶다 싶으신 분들
9. 참고하기

http://wiki.kldp.org/HOWTO//html/Adv-Bash-Scr-HOWTO/index.html

여리글 참고 하시면 엄청 고수가 될수 있어요.

어른이 여러분 참 쉽죠 ^^ 여러분도 쉘스크립트 고수가 될수 있어요.

그럼 다음 시간에 만나요

나도개발자다.잉~~

끝~~~~~~

설정

트랙백

댓글

  • ugg 2013.04.10 18:27 답글 | 수정/삭제 | ADDR

    태양이 바다에 미광을 비추면,나는 너를 생각한다.

  • 스프링전 2015.06.19 09:35 신고 답글 | 수정/삭제 | ADDR

    깔끔하게 한포스트에 정리가 잘 되었네요 ^^
    많은 도움 되었습니다~ 감사합니다.

  • halora 2016.12.11 17:08 신고 답글 | 수정/삭제 | ADDR

    정리가 너무 잘되어있어요 +_+! 스크립트 개념도 없던 저에게 너무 많은 도움이 되었습니다. 감사합니다!

와 큰일났다!!

이거 시스템 관리자가 설치만 해줬지 직접 설치 하려나 앞이 깜깜하다 어떻게 해야할까??

그럼 누구나 쉽다하는 CentOS APM 나도 한번 따라하고 봐야겠다

우선 APM 하면 거창해 보인다 ... 뿌이뿌잉 ㅋㅋ
무엇인지 확인해보자

A : apache
P : php
M : mysql

우리가 오늘 해야 할것은 설치에도 여러가지 방법이나 커스트마이징 방법들이 있겠지만 ...
나 같은 왕초보들을 위한  yum 을 이용한 방법으로 진행하겠습니다.

* 설치순서
1. apache (아파치)
2. mysql
3. php
순으로 하겠습니다.

* 우선 필요한 준비물
1. ssh, putty 등의 shell 원격 접속 프로그램
- 리눅스 자체 콘솔 보다는 Putty가 다루는데 많은 편의를 제공 할 것이다.
   "창 - 변환 - 수신 데이터의 문자 셋 변환"에서 UTF8로 설정하고 접속 하면 한글도 잘 보이고 좋다.

2. FTP
ftp서버 환경을 미리구성하고 놓고 작업을 하면 조금은 더 편하다. 언젠가는 설치 해야 하니까 FTP환경을 구축해보자. 설치는 vsftpd를 해보자.

# yum -y install vsftpd

설정 편집은 다음과 같이 하자.
# vi /etc/vsftpd/vsftpd.conf
편집은 i키를 누르고 수정, esc키를 눌러 편집 종료, :wq 라고 입력하고 엔터 하면 저장 하고 종료.
특별히 지금은 설정할 필요가 별로 없다. 나중에 인터넷의 각졸 글들을 참조 해서 설정해주고 일단 chroot_list만 비활성또는 주석 되어 있는지 확인만 하자. 이유는 내 폴더의 상위에 접속 할 수 있어야 설치 단계에서는 그나마 편하기 때문인데 나중에 보안의 문제가 있으니 나중에는 막아 두길 권장한다.

뿌띠와 FTP서버가 준비 되었으면 설치 작업을 시작 한다.

설치하기

apacahe, mysql, php순으로 APM 설치
# yum -y install httpd
# yum -y install mysql
# yum -y install php

보통 알아서 빠른 미러를 찾아 의존성까지 확인해서 연계된 필수 패키지까지 알아서 설치 해준다.

관련 라이브러리 설치
# yum -y install gd gd-devel
# yum -y install libpng libpng-devel
# yum -y install libjpeg libjpeg-devel
# yum -y install freetype freetype-devel
# yum -y install fontconfig  fontconfig-devel
# yum -y install libxml2 libxml2-devel
# yum -y install openssl openssl-devel
# yum -y install gmp gmp-devel
# yum -y install mhash mhash-devel
# yum -y install libmcrypt libmcrypt-devel
# yum -y install mysql-server
# yum -y install php-mysql
# yum -y install php-devel
# yum -y install php-gd
# yum -y install php-mbstring
# yum -y install php-mhash

이 밖에도 pear나 pear-MDB2등 원하는 패키지를 설치 할 수도 있다.

* 제일 처음에 나오는 gd를 설치하면 뒤에 나오는 libjpeg, libpng, freetype, fontconfig과 같이 자동으로 설치되지만 혹시나 하는 분들은 확인겸 설치 해보기 바란다.

Mysql 설정

기본관리 db를 설정하고, 권한지정도 해주자
# /usr/bin/mysql_install_db --user=mysql
# chown -R root /usr/bin/
# chgrp -R mysql /usr/bin/
# chown -R mysql /var/lib/mysql/

이제 콘솔에서도 mysql 명령들을 사용 할 수 있도록 등록해보자.
# vi ~/.bash_profile
PATH부분에 다음과 같이 추가 한다
PATH=$PATH:$HOME/bin:/usr/bin

지루한 mysql 설정은 이제 다 끝났다 다만 재부팅 후 자동으로 실행 할 수 있도록 등록만 해주면 된다. 일단 확인 해보자.
# chkconfig  --list | grep mysqld
mysqld  0:off 1:off 2:on 3:on 4:on 5:on 6:off
위와 같이 나오지 않는다면?
# chkconfig --level 2345 mysqld on
다시 확인해 보면 원하는 대로 되어 있을 것이다.

이제 mysql를 시작하고 루트 비밀번호를 설정하고 동작 하는지 확인한 후 mysql은 끝내자.
# /etc/rc.d/init.d/mysqld start
# /usr/bin/mysqladmin -uroot password 비번

동작은 하나?
# netstat -lntp
위와 같은 명령에서 보이는 결과중 "mysqld"  ":::3306" 뭐 이런 글귀가 보이면 정상적으로 동작한다고 생각해도 된다.


PHP 설치

vi /etc/httpd/conf.d/php.conf

아래 두줄을 찾아 아래처럼 고친다. 

AddHandler php5-script .php .htm .html
AddType application/x-httpd-php-source .phps .php .htm .html

수정이 끝났으면 저장 하고  같은 방법으로 httpd.conf 파일을 아래와 같은 부분들을 찾아 수정/추가한다.

vi /etc/httpd/conf/httpd.conf


#ServerName www.example.com:80 (자신의 서버이름이니 알아서 적당히)
   => ServerName localhost:80

Options Indexes FollowSymLinks 
  => Options -Indexes

AllowOverride None
  => AllowOverride All

DirectoryIndex index.html index.html.var
 => DirectoryIndex index.html index.htm index.php

AddType application/x-gzip .gz .tgz 을 찾아 그 다음줄에 아래 두줄  내용 추가
AddType application/x-httpd-php .htm .html .php .ph php3 .php4 .phtml .inc
AddType application/x-httpd-php-source .phps

#AddHandler cgi-script .cgi 주석 삭제
  => AddHandler cgi-script .cgi


*  
사실 vi vim 리눅스의 에디터는 윈도우즈에 익숙한 사람에게는 없이 당황하게 만드는 소프트웨어중 하나인데(적응만 한다면 없는 최고의 에디터라지만 적응은 요원하기만 하다!) 쉽게 사용을 원한다면 "#yum -y install mc" 해서 mc 사용해 보라 조금은 편하게 사용 있을 것이다.
 사실 제일 편한건 콘솔에서 직접 하는 것보다 뿌띠로 열어서  하는것과 FTP로 수정 하는것이다.. 위에서 FTP로는 에디트플러스 같은걸로 바로 수정하면 되니까..



APACHE 설치


특별히 다른 것은 없고 부팅 자동 실행이 되도록 되어 있나 확인만 해보자

# chkconfig  --list | grep httpd
httpd  0:off 1:off 2:on 3:on 4:on 5:on 6:off
역시나 위처럼 나오지 않는다면 아래와 같이 설정한다.
# chkconfig --level 2345 httpd on
다시 확인해 보면 원하는 대로 되어 있을 것이다.

이제 apache를 시작해보고 동작이 되는지 확인한다
# /usr/sbin/apachectl start
# netstat -lntp
위와 같은 명령에서 보이는 결과중 "httpd"  ":::80" 뭐 이런 글귀가 보이면 정상적으로 동작한다고 생각해도 된다.

마무리

끝으로 시스템을 전체적으로 업데이트 해보자.
# yum update
주루룩 뭔가 많이 지나가고 업데이트 된다. 끝났다면
# reboot

으로 시스템을 재시작 함으로서 모든 설치 과정은 끝난다.


추가
위 방법대로 설치시 PHP 5.1.6으로 설치 된다. 이러저러한 이유로 상위 버전으로 설치하고 싶다면 아래처럼 해보자.
 
# cd /etc/yum.repos.d
# wget http://dev.centos.org/centos/5/CentOS-Testing.repo
$ yum --enablerepo=c5-testing update php

이렇게 하면 5.2.10으로 설치된다.

나중에 상위버전으로 설치한 경우 반드시 yum update 해줘야 함을 잊지말자! 꼭..


설정

트랙백

댓글

오늘은 httpd.conf 설정에 대해 한번 알아 보도록 할까요?

예전에 야휴 코리아를 면저보러 갔었는데요 거기 개발팀장이 httpd.conf 에 생각 나는 셋팅 값들을 나열하라고 하데요. 셋팅은 하지만 기억력이 별로 않좋은 저로서는 식은 땀이 뚝뚝 결국 낙방을 하였답니다.  ㅋㅋㅋ
여러분도 중요한 셋팅 몇 개정도는 기억하고 있어야 나도 개발자구나 하고 말할수 있을꺼 같은데요 .. ㅋㅋㅋ

아파치의 설정은 3개의 section 으로 나울수 있습니다.
Section 1 : Global Environment
Section 2: 'Main' server configuration
Section 3: Virtual Hosts

Section 1 : Global Environment


ServerType standalone

 - apache웹서버가 운영되는 형태 (단독 실행 웹서버로 동작함)

ServerRoot "/usr/local/apache"

 - apache가 설치된 경로

PidFile /usr/local/apache/logs/httpd.pid

 - apache가 실행될때의 pid값을 가지고 있는 Pid파일의 경로

ScoreBoardFile /usr/local/apache/logs/httpd.scoreboard

 - apache scoreboard 파일이 있는 경로

Timeout 300

 - 클라이언트가 서버에 요청을 한뒤 클라이언트에서 아무런 응답이 없어서 오류로 처리하기까지의 대기 시간

KeepAlive On

 - 서버에 한번 연결을 했던 클라이언트가 다시 연결 요청을 할 것이라고 생각하고, 클라이언트의 요청을 처리하고 나서 연결을 끊지 않고 유지한다는 설정으로, 클라이언트가 다시 요청을 했을 때 서버와의 접속요청 절차를 거치지 않아도 되므로, 접속 속도가 향상된다. Off에 비해서 20-30% 정도의 성능 향상을 기대할 수 있다. 단 동시 접속자가 많을경우에는 메모리가 충분해야 한다. Off로 하였을 경우 On보다 많은 동시 접속자를 처리할 수 있지만, 매회 연결 때마다 서버와의 통신을 해야 하므로 접속 속도도 늦고, cpu에 로드가 발생한다. 하지만 검색엔진 등의 접속자가 아주 많고, 단일 접속만 하고 접속을 끊는 사이트에서는 Off로 사용하는 것이 오히려 도움이 된다.

MaxKeepAliveRequests 100

 - 서버가 클라이언트와의 접속을 유지하면서 최대 클라이언트로부터 받을 수 있는 요청의 수이다. 즉 한번 연결 후에 클라이언트에서 100번의 요청을 받았다면 자동으로 설정을 끊는것이다. 0으로 설정을 하는 것은 클라이언트에서 스스로 접속을 끊을 때까지 모든 요청을 받는다는 것이다 웹사이트가 복잡하게 되어있는 웹 서버에서는 이 값을 늘여주는 것이 좋다.

KeepAliveTimeout 15

 - 접속이 유지된다고 해도 하루 종일 되어있다면 동시 접속자 제한에 걸려서 웹서버의 접속을 할 수 없게 된다. 이때 설정해주는 값으로 지정된 시간동안 요청이 없으면 연결을 서버에서 연결을 끊어버리게 되어 다른 접속자가 웹서버에 접속할 수 있도록 설정해 주는 것이다. ( 동시 접속자가 많을때 웹서버 성능을 너무 떨어뜨리지 않게 하기 위해서 KeepAlive On으로 설정해놓고, 이 값을 줄여주는 방법도 있다.)

MinSpareServers 5 ( 접속자가 많은 경우 10-15 정도로 설정 )

 - apache는 클라이언트로부터 요청을 받으면 자식 프로세서를 하나 생성하여 그 요청에 응답을 하도록 되어있다. 만약 생성된 프로세서가 없다면 접속시에 지연시간이 발생하므로 속도 증진을 위해서 미리 여분의 응답용 자식 프로세서를 생성해 놓는 것이다.

MaxSpareServers 10

 - 최대로 만들 수 있는 자식 프로세서의 수를 지정한다. ( 접속자가 많을 경우 40-50으로 설정)

StartServers 5

 - 서버가 시작시에 만들어낼  응답 프로세서의 수를 지정 (MinSpareServers와 동일하게 설정)

MaxClients 150

 - 최대 접속할수 있는 동시 접속자수 (호스트웨이에서는 1024까지 확장할수 있도록 컴파일 됨)

MaxRequestsPerChild 0

 - 자식 프로세서 하나당 처리할 수 있는 최대 요청수. default 0으로, 자식 프로세서가 죽지 않으므로 속도향상을 기대할 수는 있으나, 잘 못된 프로그래밍이나 코드 수행으로 인해서 문제가 발생할 경우에는 서버 전체에 부하를 유발할 수가 있다. (보통 300 정도로 설정하고, 사이트가 복잡 하거나 요청이 많아야 할경우에는 500-1000 등으로 수치를 올려준다.)

Section 2: 'Main' server configuration


Port 80

 - apache Webserver가 사용하게될 포트 지정

User nobody

 - apache 데몬이 실행될때 소유권자

Group nobody

 - apache 데몬이 실행될때 그룹 소유권자

ServerAdmin root@fduser.org

 - 서버의 관리자 ( 관리할 사람의 이메일을 적어놓는다. )

ServerName manpage.co.kr

 - 서버의 이름, 호스트명

DocumentRoot "/usr/local/apache/htdocs"

 - apache 웹서버의 기본 홈 디렉토리

<Directory /home/-/public_html>

   AllowOverride FileInfo AuthConfig Limit

   Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec

</Directory>

 - /home/-/public_html 디렉토리에 대한 디렉토리 옵션을 나타낸다.

 디렉토리 옵션에는 그 종류가 여러 가지가 있으며, 다음에 자세히 알아보기로 한다.

<IfModule mod_dir.c>

   DirectoryIndex index.html index.php index.htm index.php3

</IfModule>

 - 클라이언트가 웹서버에 대한 요청이 있을때 해당 도메인이 디렉토리 안에서 가장 먼저 읽을 파일을 지정한다.

DefaultType text/plain

 - 서버에서 사용되는 문서 중 MIME type으로 알수 없는 문서에 대해 기본 적용할 기본 MIME type을 설정한다. 서버에 문서파일이 많을때 text/plain을 사용하며 바이너리나 실행파일이 많을 경우 application/octet-stream을 적용해준다.

HostnameLookups Off

 - 접속하는 서버들의 IP DNS에게 질의하는 옵션, 만약 On으로 설정시에는 IP DNS서버에 질의해서 로그에 기록하므로 시간이 오래 걸리게 된다. 성능향상을 위해서 Off 적용

ErrorLog /usr/local/apache/logs/error_log

 - 서버의 기본 error_log를 기록하는 파일의 경로

LogLevel warn

 - log를 기록하는 level을 정한다. 로그를 기록하는 level debug, notice, warn, error, crit, alert, emerg 가 있으며, debug쪽에 갈수록 사소한 문제까지도 로그에 기록하므로 로그의 크기가 커지게 되고, emerg쪽으로 갈수록 비상시의 문제 발생시에만 로그에 기록이 되므로 로그의 크기가 그다지 커지지는 않는다. default로는 warn이며, 필요시에 따라 로그 기록하는 level을 변경할 수가 있다.

CustomLog /usr/local/apache/logs/access_log common

 - 서버의 기본 접속 기록에 대한 로그파일의 경로이다.

AddType application/x-httpd-php .php .php3 .ph .inc .html .htm

AddType application/x-httpd-php-source .phps

 - 위 두 라인은 php를 사용할 때 필요한 옵션이다.

AddHandler cgi-script .cgi

 - cgi를 사용하고자 할때 사용

AddType text/html .shtml

AddHandler server-parsed .shtml

 - 위 두 라인은 shtml을 사용하고자 할때 사용

Section 3: Virtual Hosts


NameVirtualHost 210.109.102.xxx

 - 이름기반 가상호스팅을 사용한다.

<VirtualHost 210.1091.02.xxx>

 - 한 아이피에 여러개의 도메인을 사용하고자 할때 설정하는 것으로 이곳에 IP대신에 도메인 이름을 적용해도 무방하다.
  
ServerAdmin fd@fduser.org

   - 해당 도메인을 관리자의 이메일

   ServerName fduser.org

   - 해당 도메인의 도메인 명

   ServerAlias www.fduser.org

   - 해당 도메인의 별칭

   DocumentRoot /home/fd

   - 해당 도메인의 홈 디렉토리

   ErrorLog logs/fduser.org-error_log

   - 해당 도메인의 에러상황이 쌓이는 로그파일

   CustomLog logs/fduser.org-access_log common

   - 해당 도메인의 정상적인 접속 상황이 쌓이는 로그파일
</VirtualHost>

설정

트랙백

댓글

크로스 도메인 무엇이 문제일까요? 문제점 부터 알아보죠.

문제점

Javascript로 개발하다보면 자주 부딪히는 문제가 cross domain 문제입니다.
AJAX 호출을 필요로 하는 기능에서 보안상 이유로 동일 서버 이외에는 막혀버립니다.

자바스크립트(Javascript) 보안 정책 중에 하나인 동일근원정책(Same-Origin Policy) 정책에 걸리는 부분이 바로 크로스 도메인을 할때 일어납니다.

다시 말하면 서로 다른 도메인에서 자바스크립트로 접근하려 했을 때 혹은 다른 서버에 Ajax통신의 결과를 받을 때 보안상 접근을 거부합니다.

다시 말해 샌드박스(SandBox) 정책입니다

해결책 1. document.domain 방법 - 서버도메인인 경우에만 사용 가능

이방법은 서브 도메인이 다를 경우 사용하는 방법입니다.

http://A.naver.com -> http://B.naver.com 호출 : 서브도메인이 달라서 접근거부
 
이 두 주소를 보면 공통인 부분이 존재합니다.
바로 이 부분을 이용해서 크로스 도메인을 해결 하려면

document.domain = "naver.com";
 
이렇게 스크립트에 넣어주면 됩니다.

해결책 2. Cross domain proxy - 가장 일반적인 접근방법

A서버 -> B서버 호출 : 도메인이 달라서 접근거부

Javascript에서 동일 서버의 URL을 호출하고,
이 URL에서 내부적으로 다른 도메인의 URL을 호출하는 것이다.

crossdomain.xml과 clientaccesspolicy.xml 파일은 아시다시피,
크로스 도메인 접근을 가능 여부를 설정하는 파일입니다.
crossdomain.xml : 일반

clientaccesspolicy.xml : 실버라이트용



이방법엔 잇점이 있다.
이 방법은 호출하는 전체 생명주기를 제어할 수 있습니다.
클라이언트에게 반환하기 전 뭔가 처리할 게 있으면 원격 서버에서 받은 데이터를 파싱할 수도 있습니다.
뭔가 에러가 발생하면 원하는 방법으로 에러를 처리할 수도 있습니다.
마지막으로 모든 원격 호출에 대해 로깅을 할 수도 있습니다.
이것으로 성공, 실패 그리고 호출빈도를 추적할 수도 있습니다.

해결책 3. Flash를 이용한 cross domain

플래쉬를 이용하는 방법입니다.

서버에 xml 설정 파일이 추가되어지고 클라이언트 단에서 flash파일이 필요합니다.
Flash를 사용하면 get/post 모든 메소드 방법을 사용 할 수 있고 크로스 도메인 문제가 생기지 않습니다.
하지만 말그대로 Flash를 사용해야 되고 Flash가 동작하지 않은 환경에서는 동작을 하지 못합니다.

해결책 4. Cross domain JSON

현재 페이지의 스크립트에서 다른 서버로 Ajax 호출을 시도하는 것은 허용되지 않습니다. 이것을 cross domain JSON을 이용하여 해결할 수 있습니다.

JSONP(JSON with Padding)를 사용합니다.
간단히 원리를 설명하면
우선 동적으로 script 태그를 생성하고 src부분에 호출할 서버 주소와 파라미터를 붙여서 넣고 document.body에 DOM메소드를 사용하여 append한다. 그렇게 하면 서버에 리퀘스트(요청)를 보내고 되고 서버는 리스판스(응답)를 하게 됩니다.
그리고 그 응답은 아래와 같은 문자열을 출력합니다.

    callback_function_name({name:"test"})

위와 같이 굵은 글씨가 바로 서버로 요청한 주소에 붙은 파라미터 값.
이것은 함수 이름으로 로드되면서 실행되게 한다. 이 함수가 넘겨받은 인자를 객체로 생성하고 지정된 콜백함수에 생성된 객체를 파라미터로 호출한다. 물론 마지막에는 붙인 script 태그는 제거한다..
 
단 get 메소드 밖에 사용할 수가 없다. 주소로 요청을 보내기 때문입니다..
이는 파라미터가 많으면 보낼수가 없다는 얘기입니다.

Cross domain JSON 자세히 알기

1. JSON -
직접 만들어본 예제 소스입니다.


JSON은 XML에 비해 브라우저와 서버 간의 정보 교환에 사용되는 경량 데이터 형식이다. JSON은 이름에서 알 수 있듯이 JavaScript 오브젝트의 문자열 표현이다. (이 사실을 간과하는 JavaScript 개발자들이 없기를 바란다.) 예를 들어, symbol과 price라는 두 속성을 가진 ticker 오브젝트가 있다고 가정해 보자. JavaScript에서는 다음과 같이 ticker 오브젝트를 정의할 수 있다.

var ticker = {symbol: 'IBM', price: 91.42};
다음은 동일한 정의를 JSON으로 표현한 것이다
{symbol: 'IBM', price: 91.42}
JSON과 JSON을 데이터 교환 형식으로 사용할 수 있는 가능성에 대한 자세한 정보는 참고자료에서 볼 수 있다. Listing 1에서는 호출되었을 때 IBM 주가를 보여 주는 JavaScript 함수를 정의한다. (이 기사에서는 코드를 웹 페이지에 통합하는 방법에 대한 상세 설명을 제공하지 않는다.)

Listing 1. showPrice 함수 정의하기
function showPrice(data) {
    alert("Symbol: " + data.symbol + ", Price: " + data.price);
}
JSON 데이터를 매개변수로 전달하여 이 함수를 호출할 수 있다
showPrice({symbol: 'IBM', price: 91.42}); // alerts: Symbol: IBM, Price: 91.42
이제 Listing 2처럼 이들 두 단계를 웹 페이지에 포함할 수 있는 준비가 완료되었다.

Listing 2. 웹 페이지에 showPrice 함수 및 매개변수 포함하기
<script type="text/javascript">
function showPrice(data) {
    alert("Symbol: " + data.symbol + ", Price: " + data.price);
}
</script>
<script type="text/javascript">showPrice({symbol: 'IBM', price: 91.42});</script>

페이지가 로드되면 그림 1과 같은 경고가 표시된다.


그림 1. IBM 티커
IBM ticker

지금까지 이 기사에서는 정적 JSON 데이터를 매개변수로 사용하여 JavaScript 함수를 호출하는 방법을 살펴보았다. 하지만 함수 호출에서 JSON 데이터를 동적으로 랩핑하여 동적 데이터와 함께 함수를 호출할 수도 있다. 이를 동적 JavaScript 삽입 기술이라고 한다. 이 기술의 작동 방법을 확인하려면 ticker.js라는 독립형 JavaScript 파일에 다음 행을 입력해야 한다.

showPrice({symbol: 'IBM', price: 91.42});
이제 웹 페이지의 스크립트를 Listing 3의 코드처럼 변경한다.

Listing 3. 동적 JavaScript 삽입 코드
<script type="text/javascript">
// This is our function to be called with JSON data
function showPrice(data) {
    alert("Symbol: " + data.symbol + ", Price: " + data.price);
}
var url = “ticker.js”; // URL of the external script
// this shows dynamic script insertion
var script = document.createElement('script');
script.setAttribute('src', url);

// load the script
document.getElementsByTagName('head')[0].appendChild(script); 
</script>

Listing 3의 예제에서, ticker.js에 파일에 있는 동적으로 삽입된 JavaScript 코드는 실제 JSON 데이터를 매개변수로 사용하여 showPrice() 함수를 호출한다.

앞에서 설명한 대로 동일 출처 정책은 동적 스크립트 요소의 문서 내 삽입을 허용하기 때문에 다른 도메인의 JavaScript를 동적으로 삽입하여 JSON 데이터를 전달할 수 있다. 이처럼 함수 호출에 랩핑된 JSON 데이터를 JSONP(JSON with Padding)라고 한다. 이 작업을 수행하려면 코드를 삽입하기 전에 콜백 함수가 미리 정의되어 있어야 한다. 이 예제에서는 showPrice()가 콜백 함수이다.

그러나 JSONP 서비스(또는 원격 JSON 서비스)는 사용자 지정 함수 호출에서 리턴된 JSON 데이터에 대한 랩핑을 지원하는 추가 기능을 가진 웹 서비스이다. 따라서 이 방법을 사용하려면 원격 서비스에서 콜백 함수 이름을 요청 매개변수로 받아야 한다. 그런 다음 원격 서비스에서 JSON 데이터를 매개변수로 전달하는 이 함수에 대한 호출이 생성되면 이 함수가 클라이언트 측 웹 페이지에 삽입되어 바로 실행된다.


2. jQuery의 JSONP 지원 - 직접 만들어본 예제 소스입니다.


jQuery 버전 1.2부터는 JSONP 호출에 대한 네이티브 지원이 제공되고 있다. JSONP 콜백을 지정한 경우 다른 도메인에 있는 JSON 데이터를 로드할 수 있으며 JSONP 콜백은 url?callback=?라는 구문을 사용하여 지정할 수 있다.

jQuery에서는 ?가 호출할 생성된 함수 이름으로 자동 변환된다. Listing 4에서는 이 코드를 보여 준다.


Listing 4. JSONP 콜백 사용하기

jQuery.getJSON(url+"&callback=?", function(data) {
    alert("Symbol: " + data.symbol + ", Price: " + data.price);
});

이를 위해 jQuery는 스크립트가 삽입될 때 호출되는 전역 함수를 창 오브젝트에 추가한다. 이 함수는 완료 후에 제거된다. jQuery는 도메인 내 호출에 대해서도 최적화 기능을 제공한다. 동일한 도메인에 대한 요청이 발생할 경우 jQuery는 해당 요청을 일반적인 Ajax 요청으로 변환한다.

JSONP 지원을 사용하는 예제 서비스

앞의 예제에서는 정적 파일(ticker.js)을 사용하여 JavaScript를 웹 페이지에 동적으로 삽입했다. JSONP 응답을 리턴하기는 하지만 URL에 콜백 함수 이름을 정의할 수 없었기 때문에 JSONP 서비스가 아니었다. 그렇다면 실제 JSONP 서비스로 변환하려면 어떻게 해야 할까? 이 기사에서는 여러 가지 방법 중에서 PHP와 Java를 사용하는 두 가지 예제를 설명한다.

먼저 서비스에서 요청 URL에 포함된 callback 매개변수를 허용한다고 가정하자. (매개변수 이름 자체는 중요하지 않지만 클라이언트와 서버에서 동일한 이름을 사용해야 한다.) 그리고 서비스에 대한 요청이 다음과 같다고 가정하자.

jQuery.getJSON("http://www.yourdomain.com/jsonp/ticker?symbol=IBM&callback=?", 
function(data) {
    alert("Symbol: " + data.symbol + ", Price: " + data.price);
});

이 코드에서는 실제 함수 이름 대신 ? 기호를 콜백 함수 이름으로 입력했다. 이는 jQuery가 ? 기호를 인라인 함수를 호출하는 생성된 함수 이름(예: jsonp1232617941775)으로 바꾸기 때문이다. 이 기능을 활용하면 showPrice()와 같은 함수를 자유롭게 정의할 수 있다.

Listing 6에서는 PHP로 구현한 JSONP 서비스의 일부를 보여 준다.


Listing 6. PHP로 구현한 JSONP 서비스의 일부
$jsonData = getDataAsJson($_GET['symbol']);
echo $_GET['callback'] . '(' . $jsonData . ');';
// prints: jsonp1232617941775({"symbol" : "IBM", "price" : "91.42"});
Listing 7에서는 동일한 기능을 수행하는 Java™ Servlet 메소드를 보여 준다.



설정

트랙백

댓글

개발자 여러분 방가워요

팝업창 하루만 띄우기 어렵지 않아요. 10분만 투자하시면 금방 하실수 있어요.

다들 알고 있지만 왜 그런지 쏙쏙 들이 분석해 보아요~~~

cookie의 기본원리

Set-Cookie 구조 :

name=Value;expires=DAT;path=PATH domain=DOMAIN_NAME;secure

 

name=Value - 쿠키의 이름으로서 반드시 지정해야 한다. 이름에 세미콜론(;), 쉼표(,), 빈칸이 들어가면 안됨

expires=DATE - 쿠키가 종료되는 날짜를 지정한다. 만약 잘짜가 생략되면 현재 넷스케이프 세션 동안에만 유효하게 된다.
                       날짜 형식 : Wdy, DD-Mon-YY HH:MM:SS GMT

                      * Wdy : a string representing the full name of the day of the week
                      * DD : an integer representing the day of the month
                      * Mon : a string representing the three-character abbreviation of the month
                      * YY : an interger representing the last two digits of the year
                      * HH, MM, SS : 2-digit representations of hours, minutes, ank seconds respectively.

path=PATH - 쿠키가 유효하게 사용될 수 있는 url 주소의 디렉토리 부분을 지정한다. 만약 지정되지 않는다면 쿠키를 설정한 문서 위치가 사용된다.

domain=DOMAIN_NAME - 쿠키가 유효하게 사용될 수 있는 url 주소의 도메인 부분을 지정하나. DOMAIN_NAME은 적어도 두개의 점으로 연결된 세개의

                                     단어로 이루어져야 하다.(예: NET-IN.CO.KR) 만약 지정되지 않는다면 쿠키를 설정한 문서 위치의 도매인이 사용된다.

secure - 데이터 전송에 보안이 요구되는지를 지정한다.(예:ssl프로토콜을 사용하는 HTTP인 HTTPS) 만약 필요하면 SECURE라는 키워드를 쓰면 된다.




소스 기본원리

1. 하루만 보기를 클릭 -> 클릭시 쿠키에 현재 경로다시시작할 시간을 담는다.
2. 해당페이지에 왔을때 현재 시간과 쿠키시간을 비교 하여 시작시간이 되지 않았으면 띄우지 않는다.

소스 1. ( 클릭시 쿠키에 값 저장 )

1 .function setCookie( name, value) {
2.            var todayDate = new Date();
3.            todayDate.setHours( 24 );
4.            document.cookie = name + "=" + escape( value ) + "; path=/; expires=" +   todayDate.toGMTString() + ";";
}


소스 1. 분석

클릭시 쿠키에 값을 저장하는 함수입니다.


첫줄    : name:쿠키명 , value:쿠키값
둘째줄 :  var todayDate = new Date();  - 현재의 년월일 시분초를 가져옵니다.
세째줄 :  쿠키저장시간 셋팅
네째줄
:  쿠키값을 만들어 준다.
              name=쿠키명,
              value=쿠키값,
              path=경로,
              expires=쿠키가 종료되는 날짜


직접 돌리면서 알아볼수 있게 간단한 예제 한번 구현해 봤습니다.
한번 직접 브라우져에서 돌아가는걸 보면서 소스 분석을 해보시면 더 이뻐 ~~~ 어렵지 않아요 .
치기 힘들면 가져가서 테스트 해도 되요. ㅋㅋㅋ 그럼 즐프(즐거운 프로그램) 되세요 .


<예제>
<html>
 <head>
    <script language="javascript">
    // === 쿠키값 가져오기 ===
    function getCookie(name) {
      var Found = false
      var start, end
      var i = 0
    
      while(i <= document.cookie.length) {
        start = i
        end = start + name.length
    
        if(document.cookie.substring(start, end) == name) {
          Found = true
          break
        }
        i++
      }
    
      if(Found == true) {
        start = end + 1
        end = document.cookie.indexOf(";", start)
          if(end < start)
            end = document.cookie.length
        return document.cookie.substring(start, end)
      }
      return ""
    }

    // === 팝업띄우기 가져오기 ===
    function openPopup()
    {
        var noticeCookie=getCookie("popup");  // 쿠키변수 이름
        if (noticeCookie != "no"){
            window.open('http://naver.com','pop1','width=350,height=400,top=50,left=150');
        }else{
            alert('아직 쿠키가 걸려있습니다.')
        }
        // window.open('팝업창 웹페이지','윈도우명','width=350,height=400,top=50,left=150');
    }

    // === 쿠키값 저장하기===
    function setCookie(name, value) {
        var todayDate = new Date();
        todayDate.setHours( 24 );
        document.cookie = name + "=" + escape( value ) + "; path=/; expires=" +   todayDate.toGMTString() + ";";
    }

    </script>
 </head>

 <body>
  <a href="javascript:openPopup()">팝업 띄우기</a>
  <a href="javascript:setCookie('popup', 'no')">24시간동안 안띄우기</a>
 </body>
</html>

설정

트랙백

댓글

글 꼴의 종류와 크기를 결정했다면, 볼드/이텔릭과 같은 글꼴의 장식 및 자간, 줄간 들여쓰기와 같은 문단 편집기능에 대하여 살펴봅니다. 몇몇 기능은 브라우저에 따라, 적용/미적용 여부가 다르며, 적용되더라도 화면의 보여지는 모습이 다릅니다. 충분한 테스트 후 활용하도록 합니다.

[ 글꼴의 굵기 지정 ]

font-weight: normal (default value);

글꼴 그룹의 어떤 굵기의 글꼴을 사용할 것인지를 설정합니다.  초기값은 normal(400)이며, 굵은 글꼴은 bold(700) 키워드를 사용합니다. 설정값은 하위 요소로 상속됩니다. 다음은 Verdana 글꼴의 굵기 속성입니다.

* normal, bold, 100~900

  • font-weight: normal
  • font-weight: bold
  • font-weight: 100
  • font-weight: 200
  • font-weight: 300
  • font-weight: 400
  • font-weight: 500
  • font-weight: 600
  • font-weight: 700
  • font-weight: 800
  • font-weight: 900

위와 같이, 일반적인 글꼴 그룹은 9종류의 굵기가 다른 글꼴이 준비되어 있지 않는 경우가 많습니다.

따라서, 일반적으로 100~900까지의 9단계의 굵기 지정보다는, 굵은 글꼴 표현을 위한, bold를 주로 사용합니다. 기본값은 normal이기 때문에, 일반 글꼴에는 특별한 지정이 필요하지 않습니다.

* lighter, bolder

100~900의 굵기의 범위에서, 현재 굵기(디폴트값 또는 상위 요소에서 상속된 값)보다 각각 한 단계 가는 글꼴, 또는 굵은 글꼴을 지정합니다.

[ 글꼴 스타일의 지정 ]

font-style: normal (default value);

글꼴 그룹의 표준, 이탤릭, 기울임 글꼴을 지정하는 속성입니다. 설정 값은 하위요소로 상속됩니다.

* normal, italic, oblique

글꼴 그룹의 종류에 따라, 이텔릭체 전용, 기울임 전용 글꼴이 디자인되어 있습니다. 해당 글꼴을 사용하도록 지정이 가능합니다. 해당 글꼴이 없는 경우에는 표준 글꼴을 기울인 글꼴이 이용됩니다. 기본값은 normal이기 때문에, 일반 글꼴에는 특별한 지정이 필요하지 않습니다. 다음은 Verdana 글꼴의 스타일 속성입니다.

  • font-style: normal
  • font-style: italic
  • font-style: oblique

[ 작은 대문자 지정 ]

font-variant: normal (default value);

영어 알파벳의 표기방식입니다. 알파벳을 대문자료 표기하되, 소문자 크기로 작게한 종류의 글꼴인 small-caps를 지정할 수 있습니다. 설정 값은 하위 요소로 상속되며, 기본값은 normal이기 때문에, 일반 글꼴에는 특별한 지정이 필요하지 않습니다.

* normal, small-caps

  • font-variant: normal
  • font-variant: small-caps

[ 대소문자 지정 ]

text-transform: none (default value);

영 어 알파벳의 표기방식입니다. 문장에 있는 단어의 첫글자만을 대문자로 표시하거나, 전체를 대문자 또는 소문자로 표기하게 할 수 있습니다. ID와 같이 대/소문자의 구분입력 단위요소에 사용할 수 있습니다. 설정 값은 하위 요소로 상속되며,  기본값은 none이기 때문에, 일반 글꼴에는 특별한 지정이 필요하지 않습니다.

* none, capitalize, lowercase, uppercase

  • text-transform: none; Capitalization effects
  • text-transform: capitalize; Capitalization effects
  • text-transform: lowercase; Capitalization effects
  • text-transform: lowercase; Capitalization effects

[ 글꼴 장식 ]

text-decoration: none (default value);

글꼴 장식에 대한 속성입니다. 아래 예와 같이, 밑줄이나 윗줄, 취소선을 표시하거나 깜박이게 할 수도 있습니다.

이 속성은 상위 요소로부터 상속되지 않습니다. 다만, 블록 레벨 요소에 대하여 지정한 경우에는 해당 박스 안에 포함되는 인라인 요소에 모두 적용됩니다. 또한, 인라인 요소에 대하여 지정한 경우에는 해당 요소가 생성하는 모든 박스에 대하여 적용됩니다.

* none, underline, overline, line-through, blink

  • text-decoration: none a tag in li tag
  • text-decoration: underline
  • text-decoration: line-through
  • text-decoration: overline
  • text-decoration: blink

위와 같이, blink옵션값은 IE에서는 적용되지 않습니다. (Firefox 2.0에는 적용됩니다)

또한, 첫번재 줄에 사용된 코드는 다음과 같습니다. 즉, 같은 레벨의 요소에는, text-decoration값이 상속되지 않습니다.

<li style="text-decoration: none;">text-decoration: none <a href="#">a tag in li tag</a></li>

[ 줄 간격 설정 ]

line-height: normal (default value);

정확히는, 인라인 요소의 높이를 설정하는 값입니다. 만약 블록 레벨 요소에 값을 지정한 경우에는, 해당 박스에 포함될 인라인 요소 박스의 최소 높이를 지정하는 것이 됩니다. 설정 값은 하위 요소로 상속됩니다.

* 인라인 요소에 대한 높이값 표현의 디폴트 값이 IE7Firefox2의 차이가 현격하기 때문에, 상위레벨(body, hemtl)에서 픽셀이나 포인트로 결정해 주는 것이 좋습니다.

  • line-height: normal
    line-height: normal
  • line-height: 150%
    line-height: 150%
  • line-height: 15px
    line-height: 15px
  • line-height: 1.5em
    line-height: 1.5em

기본값은 normal이며, 브라우저가 적절한 줄간격을 설정합니다. "실수값+단위 형태"로 지정할 수 있습니다.

전각(em)의 경우는, 해당 글꼴의 줄 간격을 1로 간주하고 퍼센티지(%)100%로 간주하고 계산되어 집니다. 즉, 상위레벨의 값을 1(em), 100(%)으로 계산하여 표현합니다. 픽셀(px) 및 포인트(pt)등과 같은 값을 지정할 수도 있습니다. 단, 인라인 레벨의 박스 높이인 만큼 음수값을 지정할 수 없습니다.

[ 문자 간격 설정 ]

letter-spacing: normal (default value);

글자와 글자의 간격을 설정하는 속성입니다. 주의할 점은 설정하는 값이 자간이 나타내는 것이 아니라, 기본 자간에 설정값이 추가(+)되는 것 입니다. 따라서, line-height와는 달리, letter-spacing값에는 음수값을 지정할 수 있습니다. 설정 값은 하위 요소로 상속됩니다.

* 문단 정렬이 좌우 배분(text-align: justify)인 경우에는, 문단 정렬에 우선되어 간격값이 조정됩니다.

[ font-family: Verdana, Gulim, Dotum, sans-serif; font-size: 9pt; ]

자간은 글꼴의 종류와 크기에 따라, 웹브라우저의 상이점이 발생합니다. 위 그림의 위의 것은 IE7에서 표현되는 스크린이며, 아래는 Firefox2에서 표현되는 모습입니다. 디폴트 상태(normal)에서는 별다른 차이가 없지만, 전각(em) 포인트(pt)등의 단위에서는 약간의 차이가 눈에 띄입니다. 픽셀(px)단위가 비교적 차이가 없어 보입니다.

[ 단어 간격 설정 ]

word-spacing: normal (default value);

공백으로 구분되는 하나의 단어와 단어 사이의 간격을 설정하는 속성입니다. 자간과 마찬가지로 설정하는 값이 단어 간격을 나타내는 것이 아니라, 기본 간격에 설정값이 추가(+)되는 것 입니다. 따라서, line-height와는 달리, word-spacing값에는 음수값을 지정할 수 있습니다. 설정 값은 하위 요소로 상속됩니다.

* 문단 정렬이 좌우 배분(text-align: justify)인 경우에는, 문단 정렬에 우선되어 간격값이 조정됩니다.

[ font-family: Verdana, Gulim, Dotum, sans-serif; font-size: 9pt; ]

단어 간격 역시, 글꼴의 종류와 크기에 따라, 웹브라우저의 상이점이 발생합니다. 위 그림의 위의 것은 IE7에서 표현되는 스크린이며, 아래는 Firefox2에서 표현되는 모습입니다. 디폴트 상태(normal)에서는 별다른 차이가 없지만, 전각(em) 포인트(pt)등의 단위에서는 약간의 차이가 눈에 띄입니다. 픽셀(px)단위가 비교적 차이가 없어 보입니다.

[ 글꼴 크기의 보정 ]

font-size-adjust: none (default value);

현재, IE7은 지원하지 않고 있으며, Firefox 2.0에서는 적용이 되는 속성으로 용도는 아래와 같습니다.

어떠한 이유로(사용자에게 글꼴이 없거나, 요소 하위에 다른 글꼴이 사용되는 등), 요소에 지정된 글꼴이 표시되지 않는 경우, 글꼴 기본 크기의 차이에 따른 이질감을 조정하기 위한 속성입니다. 해당 글꼴(지정한 글꼴) 크기에 대한 소문자 x의 높이의 비율을 지정해 두면, 다른 글꼴이 사용되더라도 소문자 x의 높이가 일정하게 유지되도록 하여 일관성을 유지하게 됩니다. 설정값은 하위요소로 상속됩니다.

아래는, Firefox 2.0font-size-adjust를 적용한 예입니다.

<div style="font-family: Verdana; font-size: 14pt; font-size-adjust: 0.54;">Verdana 14pt <font style="font-family: 'Times New Roman';">Times New Roman 14pt</font></div>

그림의 위쪽은 font-size-adjust를 적용하지 않은 경우이며, 아래는 0.54값이 적용된 경우입니다.

주의할 점은, 해당 값에 따라 지정된 글꼴(위의 경우 Verdana)도 크기가 보정될 수 있다는 점입니다. 따라서, 충분한 테스트 및 검증을 해 준 후 사용하도록 합니다.

한가지 재미있는 점은, 영문 글꼴을 대표글꼴로 설정하여 사용하는 경우, 한글의 크기가 브라우저에 따라 같지 않은 문제를, 이 속성을 통해 어느정도 보완할 수가 있다는 점이 있습니다. (적어도, IE에서는 적용되지 않기 때문입니다)

위와 같이, 절절한 font-size-adjust값을 주어, 한글 글꼴을 조정해 줄 수 있습니다. 물론, IE에서는 적용되지 않기 때문에, IE에 맞춘 스타일시트에 Firefox의 한글크기 문제가 있는 경우 사용할 수 있습니다.

[ 장평 설정 ]

font-stretch: norman (default value);

현재, IE7, Firefox 2.0모두 지원하지 않습니다. 총 9단계의 속성값이 있습니다.

ultra-condensed, extra-condensed, condensed, semi-condensed, normal, semi-expanded, expanded, extra-expanded, ultra-expanded이 있으며, 왼쪽에서 오른족으로 갈 수록 폭이 넓어집니다.

CSS

설정

트랙백

댓글

현 재 페이지의 스크립트에서 다른 서버로 Ajax 호출을 시도하는 것은 허용되지 않습니다. 이것을 cross domain JSON을 이용하여 해결할 수 있는데 다음 URL에서 cross domain JSON을 이용한 원격 호출 방법과 간단한 JavaScript 유틸리티를 제시합니다.

그럼 어떻게 JSON을 이용하여 다른 서버의 서비스를 호출할 수 있는지 살펴보겠습니다. 원리를 알면 쉽게 나에게 적합한 유틸리티를 만들수 있을 겁니다.

스크립트 태그

다음은 스크립트 태그입니다. 보통 아래와 같이 사용합니다.

test.js

1. alert('OK');

 test.html

1 ...
2 <script type="text/javascript" src="js/test.js"></script>
3 ...

그럼 js 디렉토리에 아래와 같은 JavaScript를 생성하는 jsp를 만들고 스크립트 태그에 다음과 같이 수정해봅니다.

test.jsp

1 alert('<%=System.getProperty("os.name")%>');

test.html
1 ...
2 <script type="text/javascript" src="http://userhost:port/js/test.jsp"></script>
3 ...


System.getProperty("os.name")은 Host의 OS 이름을 가져오는 Java 코드이고 서버에서 실행되는 코드입니다.
위와 같이 하면 해당 서버의 OS 이름이 나타날 겁니다.


스크립트 src의 URL에 제약이 없다

위의 test.jsp가 이 서버말고 다른 서버(도메인)에 있더라도 동작합니다.
그럼 test.jsp를 다른 서버에 올려놓고 다음과 같이 스크립트 태그를 수정해 봅니다.
test.html
1 ...
2 <script type="text/javascript" src="http://remote:port/js/test.jsp"></script>
3 ...

원격 서버의 OS 이름이 나타날 겁니다.

그럼 test.jsp를 다음과 같은 스크립트를 생성하도록 바꾸고, test.html에는 getHostOs라는 JavaScript 함수를 만들어 놓습니다.
(내서버) test.html
1 ...
2 <script type="text/javascript">
3 function getHostOs(response) {
4     alert(response.osName);
5 }
6 </script>
7 <script type="text/javascript" src="http://remote:port/js/test.jsp"></script>
8 ...


(원격서버) test.jsp
1 getHostOs({osName:'<%=System.getProperty("os.name")%>'});

7번째 줄 javascript 태그에서 원격에서 생성된 스크립트를 실행합니다. 원격 서버에서 생성된 스크립트를 보니 JSON 데이터를 만들고 그걸 파라메터로 getHostOs 라는 함수를 호출하는군요. 이 함수는 이미 페이지에 준비되어 있습니다. (callback 함수라고 합니다.) 즉 아래와 동일한 결과죠.
1 ...
02 <script type="text/javascript">
03 function getHostOs(response) {
04     alert(response.osName);
05 }
06 </script>
07  
08 <script type="text/javascript">
09 getHostOs({osName:'Linux'});
10 </script>
11 ...

여기서 관심있게 볼 부분은 8번째 줄
{osName:'Linux'}이 원격에서 생성한 JSON 데이터라는 것입니다.


실전
원격의 JSON 데이터를 가지고 오기 위해서는 <script type... src="..."></script> 부분이 필요합니다.
원격 서비스 호출을 하는 JavaScript 유틸리티를 만들려면 원격 호출할 때마다 위 방식의 스크립트 태그가 필요하니 동적으로 생성하면 됩니다.
1 ...
2 scriptObj = document.createElement("script");
3 scriptObj.setAttribute("type", "text/javascript");
4 scriptObj.setAttribute("charset", "utf-8");
5 scriptObj.setAttribute("src", remoteUrl);
6 ...


원격 서비스마다 응답 JSON을 처리하는 방법이 다르므로 callback 함수 이름은 요청마다 다르게 해주어야 하며 원격 서버는 callback 이름을 파라메터로 받아 그 함수이름으로 JSON을 파라메터로 넘기는 스크립트를 생성해주어야 합니다. 즉 callback 함수로 감싸면 됩니다.

http://www.xml.com/pub/a/2005/12/21/json-dynamic-script-tag.html  기사에 있는 예제 http://www.xml.com/2005/12/21/examples/jsr_class.zip 소스를 참고하시면 JSON을 이용한 자신만의 cross domain 호출 유틸리티를 만들 수 있을 겁니다.

다른 Cross domain Ajax 방법도 참조하세요.

설정

트랙백

댓글

JQuery 의 장점과  시작하기

  jquery 를 써야 할까요?



jQuery는 지구상에서 가장 인기있는 자바스크립트 라이브러리입니다. 2011년 6월 현재 w3techs.com 통계에 따르면 지구촌 1/3 웹 사이트가 jQuery를 사용하고 있고, 자바스크립트 라이브러리를 사용하는 사이트 중 4/5 웹 사이트가 jQuery를 사용하고 있습니다.
이 정도면 대세라 부를만 하지요.

장점과 초기시작 하는 방버을 알아보도록 하겠습니다.


JavaScript library

๏ 기능과 UI가 많아질 수록 복잡도가 증가한다.
  - 재사용될 수 있는 기능들을 라이브러리화 한다.
๏ 개발시 자주 사용되는 기능을 라이브러라화 하는 프로젝트들이 많다.
  - Prototype, mooTools, YUI, Dojo, Ext JS, etc.
๏ 개발해야 하는 제품의 특성에 따라서 사용한다.
  - 직접 만들수도 있고 공개 라이브러리를 사용할 수도 있다.
  - 효용성(크기, 기능, 시간 등)을 생각해 본다.



jQuery write less, do more

๏ 문법이 간결하다.
๏ 사용하기 쉽다.
๏ 빠르게 배울 수 있다.
๏ 다른 라이브러리들과 충돌을 일으키지 않는다.
๏ 다양한 플러그인이 존재한다.
๏ 브라우저 호환성 문제를 해결해준다.
๏ MIT and GPL licenses.



jQuery 라이브러리 참조하기

๏ jquery 라이브러리는 jquery.com에서 스크립트 파일을 다운로드 받을수 있습니다.
<script src="jquery.js"></script>
<script>
// your script goes here.
</script>

๏ 그러나 jQuery 라이브러리 파일을 다운받지 않고 CDN 서버가 제공하는 파일을 직접 링크해도 됩니다
๏ CDN(Content delivery network)도 사용할 수 있다.

- jQuery CDN : http://code.jquery.com/jquery-latest.min.js

- Google Ajax API CDN : http//ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js
- Microsoft CDN : http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.6.1.min.js


<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script >
// your script goes here.
</script>





설정

트랙백

댓글

  • ugg 2013.04.10 18:48 답글 | 수정/삭제 | ADDR

    눈을 감아봐 입가에 미소가 떠오르면 네가 사랑하는 그 사람이 널 사랑하고 있는거야.

주소 :
http://www.lucidchart.com/documents/demo/4d004cbe-c2dc-4da9-8ee2-26100af90ae1


내용 :

설정

트랙백

댓글