금요일 네이버신문에 이런 기사가 올라 왔군요.



벌써 100만이라니 처음에 사용한게 얼마 안되었는데.

처음엔 무전기라는 개념이 무지 어색했는데요 . 지금은 참 편리한 기능인것 같습니다.

문자, 음성, 사진이 따로 저장되고 참 편리합니다.

이번 안드로이드 업데이트로 속도나 디자인이 더 좋아진것 같습니다.

한가지 단점이라면 아이폰 업데이트가 좀 느린것 같습니다.

아이폰 가진 친구들과도 같이 하고 싶네요.

빨리 업데이트 해주세요 .

추신: 돈 꿔줄때 저장해 놓으면 좋겠는데요.. ㅋㅋ

여러분도 한번 사용해 보세요 .

설정

트랙백

댓글

안녕하세요 나도개발다.잉 입니다.

여러분은 어떤 비밀번호를 쓰시나요

오늘 해커들이 가장 좋아하는 최악의 비밀번호가 공개됐습니다.

지난 17일(현지시각) 미국의 인터넷 서비스업체인 AOL은 인터넷보안업체 스플래시데이터를 인용해 올해 해커들이 훔쳐낸 최악의 비밀번호 25개를 선정해 공개했습니다.

공개된 25개의 비밀번호는 스플래시데이터가 올해 해커들이 훔쳐낸 뒤 온라인상에 올린 수백만 건비밀번호가 담긴 파일들을 파악해 해커들이 가장 쉽게 접근할 수 있는 것들을 골라낸 것들입니다.

10위 부터 1위를  발표 하겠습니다. 긴장 되죠.

10위 - dragon
9위 -
trustno1
8위 -
trustno1
7위 -
letmein
6위 -
monkey
5위 -
abc123
4위  -
qwerty

자 두두두두두두두

3위 -
12345678
와 ~~~~~
참 귀찮은 사용자들이나 컴맹들이 쓰는 비번이죠.
저도 개발자입니다만 저런때가 있었죠..

그럼 2위 -
123456
오~~~ 귀차니즘 들 어쩔꺼야 어쩔꺼야 .. 너희들이 정보는 이미 대부업체에 넘어 간거 ~~

자 그럼 대망의 1위
'password(비밀번호)' 가 뽑혔습니다.
오 역시 실망스럽지 않은 결과입니다.
개발자들도 은 물로 일반인들도 쉽개 사용할수 있는 비번이죠.

시살 난 니가 지난 번에 만든 비밀번호를 알고 있다. ㅋㅋㅋㅋ

개인적으로는 asdf로 시작되는 비번도 꽤 있을 꺼라고 생각됩니다. 풋 걸렸다 나도 그래 ...ㅜㅜ

비밀번호를 만들때 최소한 8자 이상, 대·소문자, 숫자기호를 섞어 쓰는 등의 방법으로 주의 할 필요가 합니다.

저도 오늘부터 비번을 바꿔야겠다.

지금도 등뒤에선 해커들이 당신의 정보를 노리고 있습니다.  으흐흐흐흐흐~~~~

설정

트랙백

댓글

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

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

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

서론이 길었습니다.

오늘늘 참 쉬운 하지만 리눅스 기초는 띄고 오셔야 하는
기초 쉘 스크립트 입니다.
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 메소드를 보여 준다.



설정

트랙백

댓글


정말 아이폰 사용자 로서 정말 희소식 입니다.


네이트 뉴스에서 이런 뉴스가 올랐습니다.


출처 :http://news.nate.com/view/20111102n03009


오늘부터 국내 소비자들도 애플 앱스토어 게임 스토어를 이용할 수 있게 된다.

애플은 2일(한국시간) 애플 앱스토어의 게임 카테고리를 전격 개방한다고 밝혔다.

애플은 문화체육관광부와 오픈마켓 게임물 자율등급 분류기준에대한 협의를 통해 앱스토어 게임스토어를 개방하기로 했다.

애플은 한국정부의 게임물 사전심의를 문제삼아 1년 7개월동안 앱스토어의 게임 카테고리를 폐쇄했었다,

그동안 아이폰과 아이패드 사용자들은 앱스토어에 등록된 게임 콘텐츠를 이용할 수 없어 상당한 불편을 겪었다.

때문에 편법적으로 해외계정을 별도로 개설하거나 엔터테인먼트 카테고리에 우회적으로 등록된 일부 게임 앱을 이용할 수 밖에 없었다.

컴투스나 게임빌, 넥슨 등 국내 게임 개발사들 역시 해외마켓에만 신작 서비스를 제공하면서 충분한 국내 이용자를 확보하지 못하는 어려움을 겪었다.

국내외 소비자와 게임업계의 반발이 이어지자 문화체육관광부는 지난 3월 이른바 '오픈마켓 게임법'을 입법, 지난 7월부터 모바일 게임의 자율심의가 가능하도록 시행령을 마련했다.

 이에따라 애플과 구글은 이후 게임 카테고리 개방협의를 시작했다.

이번 개방조치로 애플 아이폰과 아이패드, 아이팟 사용자들은 앱스토어에서 국내외 게임물 6만여건을 즉시 이용할 수 있게 된다.

국내 게임 개발사들도 신작 게임을 앱스토어 등록 즉시 국내 소비자들에게 판매할 수 있게됨에 따라 상당한 매출 상승효과가 기대된다.

한편 구글코리아 역시 안드로이드 마켓에 자율심의 기준을 적용해 게임을 서비스할 예정이다.

아직 시점은 정해지지 않았지만 이르면 이달 초부터 서비스가 이뤄질 전망이다


우후 국내 게임 업체 들도 앞다투어 앱게임 시장에 발을 담그겠군요.

설정

트랙백

댓글

개발자 여러분 방가워요

팝업창 하루만 띄우기 어렵지 않아요. 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>

설정

트랙백

댓글


엑스페리아 아크
참 괜찮은 폰입니다.
디자인 좋아 카메라 굿이고
하지마 이런 젠X
내부 용량이 쥐꼬리라 뭐좀 하려고 하면 용량이 부족하다고 삑삑 거리는거 정도?

그래서 이곳 저곳 정보를 뒤지다가 드디어 발견 했습니다.
어플들을 강제로 SD카드에 옮기는 방법이 있더군요.

그런데, 이게 또 조금 지난 버전이라 지금하고는 약간 다른 느낌.
하루를 버벅대다가 다시 이곳 저곳 뒤지고... 겨우 노력의 결실을 맺었습니다.

제가 사용하는 PC가 윈도우7인 관계로 다른 xp나 비스타는 잘 모르겠습니다.
이점 양해해 주시기 바랍니다.

1. 자바 JDK 설치
다운 링크 http://www.oracle.com/technetwork/java/javase/downloads/index.html
위 링크를 누르면 아래와 같은 화면이 있습니다.
두개 중 아무거나 다운을 받으신 후 설치를 해 주시기 바랍니다.



2. 안드로이드 SDK 다운
다운로드 링크 : http://developer.android.com/sdk/index.html
위 링크로 들어가면 아래와 같은 화면이 있습니다.
저 같은 경으는 윈도우를 사용하고 있기에 윈도우에 맞는 SDK를 다운 받았습니다.
다른 OS를 사용하시는 분들은 자신의 OS에 맞는 SDK를 다운 받아 주시기 바랍니다.



3. 안드로이드 SDK 설치
안드로이드 SDK를 다운 받으셨다면 이제 설치를 해야 합니다.
android-sdk_r08-windows.zip이라는 파일인데, 압축을 푸시면 그 안에 SDK Manager.exe라는 파일이 있습니다.
SDK Manager를 실행 시키면 아래와 같은 화면이 나옵니다.



조금 기다렸다가 완료가 되면 Settings에서 아래 이미지와 같이 체크를 합니다.


이 후에 Available packages에서 Google Usb Driver Package, revision 4를 찾아  체크를 해 준 뒤
Install Selected를 눌러 줍니다.
(설명에서는 USB드라이버 하나만 선택을 했지만, 저는 Google Inc에 있는 모든것을 설치 했습니다.)









인스톨을 하는데 시간이 조금 걸립니다. 끈기를 가지고 기다려 줍니다!!

인스톨이 완료 되면 SDK를 설치했던 폴더에 아래와 같이 google-usb_driver가 생긴것을 볼 수 있습니다.


4. 넥서스원에 디버그 모드
넥서스원을 켜고 설정 > 애플리케이션 > 개발로 들어가 아래와 같이 USB 디버깅켜진상태로 유지에 체크를 해 주세요.



그리고 넥서스원과 PC를 연결하면 넥서스원을 인식못하는 현상이 발생합니다.
이때 넥서스원 드라이버를 수동으로 업데이트 해 줍니다.

5. 넥서스원 드라이버 업데이트
장치및 프린터에 들어가 보면 아래와 같이 넥서스원이 보입니다.

우클릭 후 속성을 선택해 주세요.


다시 속성을 클릭


드라이버 업데이트 클릭


수동으로 찾기 클릭


찾아보기를 눌러 SDK가 설치된 폴더의 USB드라이버를 선택해 줍니다.
(저는 편의상 압축을 푼 android-sdk-windows폴더를 android라고 바꿔 줬습니다.)
경로를 선택한 후 다음을 눌러 업데이트를 완료 합니다.

6. 환경변수 설정
이 부분이 가장 힘들고 난해한 부분입니다만, 잘 보고 따라 하시면 아무런 문제가 없습니다.

내컴퓨터 우클릭 > 속성 선택


고급 시스템 설정 클릭


환경 변수 클릭


시스템 변수에서 Path를 찾아 선택 한 후 편집 클릭



기존 변수 값의 가장 맨 끝에 세미콜론(;)를 붙여준 다음 안드로이드 SDK가 설치된 경로에서
platform-tools를 입력해 준 뒤 확인 클릭.
저 같은 경우는 C:\android\platform-tools입니다.
(이때 기존의 시스템 변수는 혹시 모르니까 복사하여 메모장에 저장해 놓으시기 바랍니다.
다른 분들이 올리신 글의 댓글을 보면 기존 변수를 지워 버렸다고 하시는 분들이 생각보다 많더라구요.)

바로 이 부분이 기존과 틀린 것 입니다. 기존은 C:\android\tools란 형식으로 tools폴더를 설정해 줘야 했는데
요즘은 진저브레드 때문에 platform-tools폴더로 변경이 됐다는 겁니다.
물론 아직 진저브레드는 아니지만 프로요 2.2.1은 이런 방식으로 해야만 된다는 거죠.
이전 다른 분들이 올린 글에서 실패하신 분들이라면 거의 80%가 이부분일거라고 생각합니다.
tip
경로를 잘 적을 자신이 없으시다면 아래 이미지 처럼 윈도우 탐색기의 경로를 미리 복사하여 두는것이 좋습니다.


7. cmd명령어 실행

시작 > 실행에서 cmd.exe를 입력한 후 확인 클릭
실행 버튼이 없으신 분들은 제가 올린 '윈도우7에서 실행버튼 찾기' 글을 참고하시기 바랍니다.


그러면 아래와 같이 나옵니다.


경로를 SDK의 platform-tools로 바꿔 줘야 합니다.
아래와 같이 사용자 계정으로 나올 때는 명령어 cd..을 입력하여 C:\>상태가 되게 만들어 줍니다.


그 뒤 자신의 SDK설치 경로를 하나씩 들어갑니다. 저 같은 경우 C > android > platform-tools이기에
아래와 같이 해 줬습니다.
다른 경로라면 명령어 cd 'SDK 설치 폴더 명'을 입력하여 들어갈 수 있습니다.


platform-tools로 성정이 되어 있다면 adb shell을 입력한 후 엔터
(저는 이때 한번 실패가 떴었습니다. 그래도 다시 한번 입력을 해 주면 정상적으로 실행이 됩니다.)


$뒤에 pm setInstallLocation 2를 입력한 후 엔터
(아래 이미지를 보시고 대 소문자를 주의하시기 바랍니다.)


다시 $가 나오면 exit를 입력 후 엔터
그리고 창을 닫아 주시기 바랍니다.


이렇게 하한 후 넥서스원과 PC를 분리한 후 넥서스 원을 껏다가 다시 켭니다.
(디버깅 체크를 해 뒀던 것을 풀어줘도 무방합니다.)
그리고 다시 설정의 애플리케이션 관리에 들어가 보면 거의 모든 어플들을 SD카드로 이동시킬 수가 있습니다.
이젠 그 어떤 대용량 어플도 두렵지가 않습니다~
모두 모두 즐거운 넥원 생활을 하시기 바랍니다.

ps: 제가 거의 블로그에 들어오지 않습니다.
질문을 하셔도 답변을 바로바로 해 드리지 못하는점 이해해 주시기 바랍니다.
또한 앞에서도 언급했던 바와같이 전 윈도우7을 사용하기에 다른 OS는 설명을 드리기가 조금 난해 합니다.

설정

트랙백

댓글

  • 난다 2012.07.21 01:46 답글 | 수정/삭제 | ADDR

    어 이거 좀 어렵지만 괜찮네요